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 ...
随机推荐
- 使用 c++ 模板显示实例化解决模板函数声明与实现分离的问题
问题背景 开始正文之前,做一些背景铺垫,方便读者了解我的工程需求.我的项目是一个客户端消息分发中心,在连接上消息后台后,后台会不定时的给我推送一些消息,我再将它们转发给本机的其它桌面产品去做显示.后台 ...
- leetcode147median-of-two-sorted-arrays
题目描述 有两个大小分别为m和n的有序数组A和B.请找出这两个数组的中位数.你需要给出时间复杂度在O(log (m+n))以内的算法. There are two sorted arrays A an ...
- 谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)
一.关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题. 1. 为什么redis能以单工作线 ...
- Python对MySQL进行增删查改
python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...
- MongoDB基础教程(安装、操作、配置)
MongoDB 下载安装 简易安装 # redhat, centOS sudo yum install -y mongodb # debian, ubuntu sudo apt install -y ...
- sql sever 2008基础知识
下面是一些总结,如果执行时发现错误,可以查看错误消息进行解决,也可上网查资料 数据库的组成: 主数据文件:有且只有一个,扩展名为.mdf. 次数据文件:可以没有,也可以有任意个.扩展名为.ndf. 日 ...
- linux之HTTP服务
1.基本的配置 httpd:俗称Apache (A pachey Server) /etc/httpd/conf/httpd.conf #配置文件 /etc/httpd/co ...
- TCP/IP模型简介和/etc/hosts文件说明
软件=协议的实现. IP决定了主机的位置.端口号决定了进程的位置. 两台主机上的通讯实际是两台主机上两个具体进程的通讯. TCP/IP模型分四层: TCP/IP模型:应用层---传输层----网络层- ...
- git 强制更新本地和强制提交覆盖
强制更新覆盖本地: git pull时出现冲突 放弃本地修改,使远程库内容强制覆盖本地代码git fetch --all //只是下载代码到本地,不进行合并操作git reset --hard ori ...
- c++11-17 模板核心知识(八)—— enable_if<>与SFINAE
引子 使用enable_if<>禁用模板 enable_if<>实例 使用Concepts简化enable_if<> SFINAE (Substitution Fa ...