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编码时应该注意的几个情况
Mar 04 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
python与C互相调用的方法详解
Jul 14 Python
Python编程之字符串模板(Template)用法实例分析
Jul 22 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
Python发送邮件的实例代码讲解
Oct 16 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
django在开发中取消外键约束的实现
May 20 Python
用60行代码实现Python自动抢微信红包
Feb 04 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
深入php处理整数函数的详解
2013/06/09 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python入门篇之字符串
2014/10/17 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python使用smtplib模块发送邮件
2020/12/17 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
工程资料员岗位职责
2014/03/10 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
公民授权委托书
2014/10/15 职场文书
岳庙导游词
2015/02/04 职场文书
老公婚前保证书
2015/02/28 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers