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 排列组合之itertools
Mar 20 Python
Python最长公共子串算法实例
Mar 07 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
django初始化数据库的实例
May 27 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
Python socket 套接字实现通信详解
Aug 27 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
利用python做数据拟合详情
Nov 17 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中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
window.onload使用指南
2015/09/13 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
vue项目实战总结篇
2018/02/11 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
详解Python的Django框架中的通用视图
2015/05/04 Python
Python实现包含min函数的栈
2016/04/29 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
高三英语教学反思
2014/01/13 职场文书
晚会邀请函范文
2014/01/24 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
教师个人培训总结
2015/02/11 职场文书
Redis keys命令的具体使用
2022/06/05 Redis