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字符串处理实例详解
May 18 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
python实现多进程代码示例
Oct 31 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
Python logging设置和logger解析
Aug 28 Python
Python用input输入列表的实例代码
Feb 07 Python
Python-openCV开运算实例
Jul 05 Python
为什么说python更适合树莓派编程
Jul 20 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
教你怎么用Python实现多路径迷宫
Apr 29 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
php猴子选大王问题解决方法
2015/05/12 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
javascript编程起步(第四课)
2007/02/27 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
JS解析XML实例分析
2015/01/30 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
Python实现读取文件最后n行的方法
2017/02/23 Python
python非递归全排列实现方法
2017/04/10 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
Python生成器generator用法示例
2018/08/10 Python
python学生管理系统
2019/01/30 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
Django实现基于类的分页功能
2019/10/31 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
卫校中专生的自我评价
2014/01/15 职场文书
电台实习生求职信
2014/02/25 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android