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

python3 通过 pybind11 使用Eigen加速相关推荐

  1. 学习笔记 —— 基于C加速的Python高效计算 (Cython pybind11)

    目录 引言 Cython 示例介绍 第一阶段优化 第二阶段优化 Cython Annotation tool 优化方法 第三阶段优化 比对下 JIT的Numba 总结 pybind11 Links I ...

  2. 在Python中调用C/C++:cython及pybind11

    在Python中调用C/C++:cython及pybind11 转自:https://zhuanlan.zhihu.com/p/442935082 Python写起来非常方便, 但面对大量for循环的 ...

  3. Python 绑定:从 Python 调用 C 或 C++

    摘要:您是拥有想要从 Python 中使用的C或 C++ 库的 Python 开发人员吗?如果是这样,那么Python 绑定允许您调用函数并将数据从 Python 传递到C或C++,让您利用这两种语言 ...

  4. MLIR Python绑定

    MLIR Python绑定 当前状态:正在开发中,默认情况下未启用 build 前提条件 • 相对较新的Python3安装 • pybind11 必须已安装,可被CMake定位(如果通过进行安装,则会 ...

  5. linux 编译 编解码

    入门demo: g++ -O3 -march=native -Wall -shared -std=c++11 -fPIC -undefined `python3 -m pybind11 --inclu ...

  6. g++ 编译pybind

    简单的: g++ -O3 -march=native -Wall -shared -std=c++11 -fPIC -undefined `python3 -m pybind11 --includes ...

  7. c++ 内存管理_Python Bindings - 从 Python 调用 C/C++

    python 最被人诟病的问题是什么? 慢,这是被人诟病最多的问题,很少人知道具体原因,极少人愿意去深入了解并找到原因,更极少的人愿意付出时间去解决这个问题,很多人都是停留在抱怨吐槽阶段,知乎上有几个 ...

  8. cuda编程python接口_混合编程[python+cpp+cuda]

    很多时候,我们是基于python进行模型的设计和运行,可是基于python本身的速度问题,使得原生态python代码无法满足生产需求,不过我们可以借助其他编程语言来缓解python开发的性能瓶颈.这里 ...

  9. python c语言接口_C/C++ 提供 Python 接口

    C/C++ 和 Python 之间的交互 Tensorflow 的核心代码是 C 和 C++ 实现然后提供 Python 的接口,使用者无需关心 C++ 的细节,直接使用 Python 就能调用相关功 ...

最新文章

  1. java ajax jquery分页插件_JQueryPagination分页插件,ajax从struts请求数据
  2. c语言常量类型转换,c语言基础教程常量变量和类型转换,免费版.doc
  3. mysql 递归查出子级_Mysql选择递归获取具有多个级别的所有子级
  4. powershell共享服务器写文件,Windows PowerShell:共享您的脚本 - 轻松实现
  5. [转] 网页不需要漂亮 Ⅰ
  6. is_file() 和 is_dir()注意事项
  7. jsp % % ! 区别
  8. 引用与取地址符的区别
  9. 记一次git pull 错误
  10. 用Python实现腾讯云点播VOD
  11. java八大数据类型_java的八大基本数据类型分别是什么?
  12. PostgreSQL 用 CTE语法 + 继承 实现平滑拆分大表
  13. SQL Server 2019数据库还原数据报错
  14. GetLastError 返回值意义
  15. javascript URIError: malformed URI sequence 谈谈url编码 encodeURI encodeURIComponent和escape
  16. IT人的地摊不就是开源么
  17. matlab模拟分数布朗运动,分数布朗运动及其模拟FractionalBrownianMotion科研菜鸟http.PDF...
  18. 高等代数_第5章:矩阵的相抵与相似
  19. 大话西游之东西南北版
  20. 阿里内部最新 Java 面试解析(全彩版)开源!(分布式 / 中间件 / 高并发 / 设计模式全都有)

热门文章

  1. Windows下更改MySQL数据库的存储位置
  2. java设计模式---迭代器模式
  3. Ubuntu快速截图
  4. Linux : SUID SGID
  5. ECC加密算法入门介绍
  6. linux正则表达式的使用方法,Linux中基本正则表达式
  7. proc文件系统编程
  8. computed vue 不 触发_vuejs render何时执行?以及使用vue.$refs遇到的坑。
  9. 计算机电缆数字是什么意思,DJYPV4*2*1.0 计算机电缆规格含义
  10. maven 打包_一次打包引发的思考,原来maven还可以这么玩~