python3 通过 pybind11 使用Eigen加速代码
python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们就需要借助c++等为我们的代码提速。下面是我使用pybind11调用c++的Eigen库的简单介绍:
第一步:准备系统和IDE:
- Windows 10
- vs2015 (用于调试c++代码)
- vscode (调试python代码)
第二步:python虚拟环境:
- 创建虚拟python虚拟环境: 在vscode的terminal中执行
python -m venv env
- 下载 Eigen: 将Eigen解压到当前目录命名为 eigen-3.3.8
- 在vscode的terminal中激活虚拟环境:
./env/Scripts/Activate.ps1
- 安装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])
第六步:编译测试
这是我当前的工作目录
注意:我的cpp_python.cpp和setup.py是在同一个文件夹下。
执行: "python .\setup.py build_ext --inplace"就会得下面的结果,生成.pyd文件表明我们已经编译成功。
运行测试:
python3 通过 pybind11 使用Eigen加速代码的更多相关文章
- Python3中的新特性(3)——代码迁移与2to3
1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...
- Python3基础系列-程序模板及代码本质
概要 横看成岭侧成峰,远近高低各不同.但是,程序的设计核心思想却是很简单,简单理解就是有一个输入,对输入的处理环节,最后得出一个输出.这个过程中的设计及其实现却是各不相同.本节的主要内容如下: 程序设 ...
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
- Selenium3 + Python3自动化测试系列十——调用JavaScript代码
调用JavaScript代码 一.调用JavaScript代码方法 Selenium在对浏览器操作时会有自动化代码中不稳定的部分,经常出错的部分,可以将这部分对网页元素进行操作的代码换成对应的Java ...
- python3汉诺塔简单实现代码
小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...
- Python3基础 使用技巧:把代码的字体变大
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- (Python3 自定义函数实现数字金字塔 代码
def kzkz(ceng): for i in range(1,ceng+1): print(" "*(ceng-i),end='') n=i while(n>=1): p ...
- (Python3) 连加 连乘 代码
a=[1,2,3,4,5,6,7,8,9,10] #连加 b=0 for i in a: b+=i print(b) #连乘 c=1 for i in a: c*=i print(c)
- python3使用selenium + Chrome基础操作代码
selenium是Python的第三方库,使用前需要安装.但是如果你使用的是anaconda,就可以省略这个步骤,为啥?自带,任性. 安装命令: pip install selenium (一)使用s ...
随机推荐
- SQL数据库表结构的修改(sql2005)
一 .ALTER TABLE命令 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 二.添加列 语法 :ALTER TABLE table_name ADD column_name d ...
- 关于layui图片/文件上传
一:常规使用 普通文件上传 (传入服务器一张图片) 1.前台代码: <!DOCTYPE html><html><head> <meta charset=& ...
- js匀速运动框架案例
点击"开始运动"按钮,红色的#red区块开始向右匀速运动,抵达到黑色竖线位置自动停止,再次点击"开始运动"#red区块也不会再运动.同时为了便于后期维护,要求运 ...
- netfilter 的扩展功能
目前内核已经有filter 功能,但是往往实际运用中需要用到一些定制的filter 功能, 所以这个时候仅仅依靠现有的不能完成,于是就出现了conntrack的扩展功能, 最直接的就是tftp he ...
- python之《线程与进程》
多线程的应用场景 不适用cpu操作密集型任务, 适合io操作密集型任务 同一进程中的数据是互通的,因为python多线程是假多线程,我们要用到多核就需要开多个进程来实现,但是坏处是数据不能互通 线程: ...
- spring的原理
一.pring的原理 1.1 IOC控制反转 ==> 扫描机制通过代理方式动态创建对象 扫描注解,通过反射获取类路径,动态创建对应类的对象,放置在对象池中(多线程做法,防止短时间内创建对象过多, ...
- android开发导包升级到androidx踩坑记录【转载】
最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼. 感谢简书上的[张晴天天天天天]做的整理. 在这里也记录一下备用. 升级Android Studio后,在 ...
- Spring Boot优雅地处理404异常
背景 在使用SpringBoot的过程中,你肯定遇到过404错误.比如下面的代码: @RestController @RequestMapping(value = "/hello" ...
- p5.js基本[一] T型高斯分布的小星星
样例 <script src="./p5/p5.js"></script> <script> function setup() { // 只写一 ...
- 面试官:小伙子,你给我讲一下java类加载机制和内存模型吧
类加载机制 虚拟机把描述类的数据从 Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期 加载(Loadi ...