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笔记(2)
Oct 24 Python
python字符串排序方法
Aug 29 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
Python实现的选择排序算法示例
Nov 29 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
简单了解Python多态与属性运行原理
Jun 15 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 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 错误之引号中使用变量
2009/05/04 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
小议Javascript中的this指针
2010/03/18 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
Python-基础-入门 简介
2014/08/09 Python
django实现前后台交互实例
2017/08/07 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
python下10个简单实例代码
2017/11/15 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
索桥的故事教学反思
2014/02/06 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
学生安全责任书模板
2014/07/25 职场文书
小学领导班子对照材料
2014/08/23 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
医生个人年度总结
2015/02/28 职场文书
业务员管理制度范本
2015/08/06 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang