python 通过 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

python 通过 pybind11 使用Eigen加速代码的步骤

4.安装pybind11:

pip install pybind11

5.安装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])

第六步:编译测试

python 通过 pybind11 使用Eigen加速代码的步骤

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

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

python 通过 pybind11 使用Eigen加速代码的步骤

运行测试:

python 通过 pybind11 使用Eigen加速代码的步骤

以上就是python 通过 pybind11 使用Eigen加速代码的步骤的详细内容,更多关于python 加速代码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python+selenium+autoit实现文件上传功能
Aug 23 Python
python 全局变量的import机制介绍
Sep 07 Python
python字典操作实例详解
Nov 16 Python
Python3中函数参数传递方式实例详解
May 05 Python
python的sorted用法详解
Jun 25 Python
python全局变量引用与修改过程解析
Jan 07 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
Mar 01 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
pandas进行数据输入和输出的方法详解
Mar 23 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
python集合的新增元素方法整理
Dec 07 #Python
You might like
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
vue interceptor 使用教程实例详解
2018/09/13 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
python self,cls,decorator的理解
2009/07/13 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python ellipsis 的用法详解
2020/11/20 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
违反校纪校规检讨书
2014/02/15 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
React实现动效弹窗组件
2021/06/21 Javascript