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实现示例
Aug 26 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python列表对象实现原理详解
Jul 01 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
详解python的super()的作用和原理
Oct 29 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python 多进程原理及实现
Dec 21 Python
python基础之文件处理知识总结
May 23 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
学习python的几条建议分享
2013/02/10 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
python 异常处理总结
2016/10/18 Python
Python实现的爬虫功能代码
2017/06/24 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Python面向对象进阶学习
2019/05/21 Python
python机器学习实现决策树
2019/11/11 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
违纪检讨书2000字
2014/02/08 职场文书
青春演讲稿范文
2014/05/08 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL