python3 通过 pybind11 使用Eigen加速

2023-11-17

 

 

python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们就需要借助c++等为我们的代码提速。下面是我使用pybind11调用c++的Eigen库的简单介绍:

第一步:准备系统和IDE:

  • Windows 10 
  • vs2015 (用于调试c++代码)
  • vscode (调试python代码)

第二步:python虚拟环境:

1.创建虚拟python虚拟环境: 在vscode的terminal中执行  

1

python -m venv env

2.下载  Eigen : 将Eigen解压到当前目录命名为 eigen-3.3.8

3.在vscode的terminal中激活虚拟环境:

1

./env/Scripts/Activate.ps1

4.安装pybind11: 

1

pip install pybind11

安装numpy==1.19.3(使用1.19.4可能会有问题) :

1

pip install numpy==1.19.3

第三步:使用vs2015编写cpp_python.cpp, 并保证没有bug

1

2

3

4

5

6

7

#include <Eigen/Dense>

using namespace std

using namespace Eigen

MatrixXd add_mat(MatrixXd A_mat, MatrixXd B_mat)

{

  return A_mat + B_mat;

}

第四步:使用pybind11为cpp_python.cpp添加python接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// cpp_python.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

//

#include <pybind11/pybind11.h>

#include <pybind11/eigen.h>

#include<pybind11/numpy.h>

#include<fstream>

#include<iostream>

#include <Eigen/Dense>

using namespace std;

using namespace Eigen;

 

MatrixXd add_mat(MatrixXd A_mat, MatrixXd B_mat)

{

    return A_mat + B_mat;

}

 

namespace py = pybind11;

PYBIND11_MODULE(add_mat_moudle, m)

{

    m.doc() = "Matrix add";//解释说明

    m.def("mat_add_py"/*在pyhon中使用的函数名*/, &add_mat);

}

第五步:设置setup.py用来编译c++代码

1

2

3

4

5

6

7

8

9

10

11

from setuptools import setup

from setuptools import Extension

 

add_mat_module = Extension(name='add_mat_moudle', # 模块名称

              sources=['cpp_python.cpp'],  # 源码

              include_dirs=[r'.\eigen-3.3.8',

                    r'.\env\Scripts',   # 依赖的第三方库的头文件

                     r'.\env\Lib\site-packages\pybind11\include']

              )

 

setup(ext_modules=[add_mat_module])

第六步:编译测试

这是我当前的工作目录

注意:我的cpp_python.cpp和setup.py是在同一个文件夹下。

1

执行: "python .\setup.py build_ext --inplace"就会得下面的结果,生成.pyd文件表明我们已经编译成功。

运行测试:

到此这篇关于python3 通过 pybind11 使用Eigen加速代码的步骤详解的文章就介绍到这了,更多相关python3 pybind1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 通过 pybind11 使用Eigen加速 的相关文章

  • ubuntu 与 windows terminal zsh 美化教程

    ubuntu 与 windows terminal zsh 美化教程 安装 zsh 和 oh my zsh 选择与安装主题 使用自带的主题 安装 powerlevel10k 主题 1 下载 p10k 主题 2 下载 Meslo LG M R

随机推荐

  • io使用率高运行堵塞怎么解决?linux系统由io使用率高引起的运行堵塞的解决方法

    1 在宝塔查看服务器负载100 而cpu和内存使用率都正常 输入top命令查看平均负载 查看结果负载果然很高 2 接着查看io使用情况 使用iotop工具 安装 yum install iotop 运行命令 iotop 如果安装不上是因为i
  • 实体类(VO,DO,DTO)的划分

    经常会接触到VO DO DTO的概念 本文从领域建模中的实体划分和项目中的实际应用情况两个角度 对这几个概念进行简析 得出的主要结论是 在项目应用中 VO对应于页面上需要显示的数据 表单 DO对应于数据库中存储的数据 数据表 DTO对应于除
  • Spring学习笔记2:注解开发、AOP思想、整合Mybatis、事务

    文章目录 7 使用注解开发 7 1 属性如何注入 1 Component 2 Value 7 2 衍生的注解 7 3 自动装配 7 4 作用域 1 Scope singleton 7 5 小结 9 使用java的方式配置Spring 9 1
  • flink连接kafka报:org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic

    报错信息 Caused by org apache flink runtime JobException Recovery is suppressed by NoRestartBackoffTimeStrategy at org apach
  • 跑通SOLOV1-V2实例分割代码,并训练自己的数据集。

    系统平台 Ubuntu18 04 硬件平台 RTX2080 super cuda和cudnn版本 cuda10 0 cudnn 7 5 6 pytorch版本 pytorch1 2 0 环境安装 创建solo虚拟环境 conda creat
  • 图(一)之邻接表Adjacency List

    开始攻克图的算法 先从最简单的存储开始实现 本文关于邻接表的实现 邻接表是图的存储中最简单也是最基本的存储结构 基于链表的思想实现的 在邻接表中 对于中的每个顶点建立一个单链表 第i个单链表中的节点表示依附于顶点的vi的边 每个节点由3个域
  • Android进阶之光:Dagger2原理简要分析

    Dagger2注入框架原理简要分析 使用Dagger2需要的依赖 implementation com google dagger dagger android 2 46 implementation com google dagger d
  • 实训九 网络服务的基本配置

    实训九 网络服务的基本配置 2017 年 4 月 16 日 今日公布 实训目标 完成本次实训 将能够 配置网卡 配置xinetd超级服务器 实训准备 两台计算机 其中一台安装RHEL6系统 该系统出来root账号外 至少还有一个普通账号 另
  • 【Linux系统编程】静态库和共享库

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 Linux系统编程 专栏定位 整理一下 C 相关的知识点 供大家学习参考 如果有收获的话 欢迎点赞 收藏 您的支
  • YOLOv5小目标检测(方法与评价)

    问题 当我们在对小目标数据集进行检测时 发现无论如何都有一些漏检的 其中我们也添加一些模块 以及其他的一些改进方法 如注意力 激活函数等等 结果始终不会令人满意 map也没有丝毫的提升 目的 增加对小目标的检测能力 不能产生漏检 自述 许多
  • ARM芯片学习(S5PV210开发)——GPIO控制LED

    1 GPIO介绍 GPIO general purpose input output 通用输入输出 GPIO就是芯片的引脚 是比较特殊的引脚 可以通过代码来操作 控制引脚的高低电平以及工作模式 与GPIO相对的就是固定功能的引脚 我们不能通
  • FPGA笔记8——串口通信(回环实验)

    目录 串口通信原理 串行通信基础知识 处理器与外部设备通信的两种方式 串行通信的通信方式 串行通信的传输方向 常见的串行通信接口 异步串口通信UART基础知识 数据格式 传输速率 接口标准 RS232接口 串口通信实验RS 232 实验任务
  • LeetCode-斐波那契数列

    class Solution public int Fibonacci int n if n 0 return 0 if n 1 return 1 return Fibonacci n 1 Fibonacci n 2 int a 0 b 1
  • 1 RocketMQ简介

    简介 RocketMQ是由阿里捐赠给Apache的一款低延迟 高并发 高可用 高可靠的分布式消息中间件 经历了淘宝双十一的洗礼 RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力 同时也具备互联网应用所需的海量消息堆积 高吞吐
  • 深入解决Linux内存管理之page fault处理

    说明 Kernel版本 4 14 ARM64处理器 Contex A53 双核 使用工具 Source Insight 3 5 Visio 1 概述 内核实现只是在进程的地址空间建立好了vma区域 并没有实际的虚拟地址到物理地址的映射操作
  • 《学会提问》-批判性思维

    这本书名为学会提问 但实际内容是讲解如何训练批判性思维能力 如何通过提问 来质疑别人的观点 选择正确的论证 来形成自己的理性决策 批判性思维的最终结果就是要求一个人虚怀若谷地接纳各种观点 理性评判这些观点 然后在理性判断的基础上决定采取哪些
  • 如何使用python调用电脑麦克录音

    import wave import pyaudio 定义数据流块 CHUNK 1024 FORMAT pyaudio paInt16 CHANNELS 2 RATE 44100 录音时间 RECORD SECONDS 5 要写入的文件名
  • 华为OD机试 C++ 回文字符串

    题目 什么是 回文串 就是一个字符串正着读和反着读都一样 而且要注意大小写的区别 例如 leVel 是一个回文串 因为正着反着都一样 art 就不是 反过来就变成 tra 了 Level 也不是 因为大小写不同 现在 你要做的就是用给定的一
  • NOIP中的数学--第6课 计数原理 (上)

    加法原理与乘法原理 1 加法原理 完成一个工程可以有n类办法 ai代表第i类方法的数目 那么完成这件事共有 S a 1 a 2 a n 种不同的方法 2 乘法原理 完成一个工程需要分n个步骤 ai 代表第i个步骤的不同方法数目 那么完成这件
  • python3 通过 pybind11 使用Eigen加速

    python是很容易上手的编程语言 但是有些时候使用python编写的程序并不能保证其运行速度 例如 while 和 for 这个时候我们就需要借助c 等为我们的代码提速 下面是我使用pybind11调用c 的Eigen库的简单介绍 第一步