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连接mysql驱动有关问题(windows版本)
Apr 23 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
Python查找第n个子串的技巧分享
Jun 27 Python
python实现顺序表的简单代码
Sep 28 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
分享PyCharm的几个使用技巧
Nov 10 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
python基础详解之if循环语句
Apr 24 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使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
JS实现密码框效果
2020/09/10 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python实现完整的事务操作示例
2017/06/20 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
班级安全教育实施方案
2014/02/23 职场文书
党员活动日总结
2014/05/05 职场文书
项目安全员岗位职责
2015/02/15 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
前台岗位职责范本
2015/04/16 职场文书
开除通知书范本
2015/04/25 职场文书
Python基础之Socket通信原理
2021/04/22 Python
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang