python3 通过 pybind11 使用Eigen加速代码的步骤详解


Posted in Python onDecember 07, 2020

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

第一步:准备系统和IDE:

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

第二步:python虚拟环境:

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

python -m venv env

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

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

./env/Scripts/Activate.ps1

4.安装pybind11: 

pip install pybind11

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

pip install numpy==1.19.3

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

#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接口

// 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++代码

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])

第六步:编译测试

这是我当前的工作目录

python3 通过 pybind11 使用Eigen加速代码的步骤详解

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

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

python3 通过 pybind11 使用Eigen加速代码的步骤详解

运行测试:

python3 通过 pybind11 使用Eigen加速代码的步骤详解

到此这篇关于python3 通过 pybind11 使用Eigen加速代码的步骤详解的文章就介绍到这了,更多相关python3 pybind11 Eigen加速代码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python 对key为时间的dict排序方法
Oct 17 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
Python中的延迟绑定原理详解
Oct 11 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python 实现的车牌识别项目
Jan 25 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
Python中Permission denied的解决方案
Apr 02 Python
python pyhs2 的安装操作
Apr 07 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 #Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 #Python
BeautifulSoup中find和find_all的使用详解
Dec 07 #Python
python爬虫beautifulsoup解析html方法
Dec 07 #Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 #Python
用ldap作为django后端用户登录验证的实现
Dec 07 #Python
Django中使用Celery的方法步骤
Dec 07 #Python
You might like
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
基于Python的身份证号码自动生成程序
2014/08/15 Python
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
Python随机函数random()使用方法小结
2018/04/29 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
Python如何将模块打包并发布
2020/08/30 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
服务之星获奖感言
2014/01/21 职场文书
2016年教师节慰问信
2015/12/01 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
关于Python中*args和**kwargs的深入理解
2021/08/07 Python