导航
当前章节:pybind-创建自己的python c++扩展库
原文链接:pybind-创建自己的python c++扩展库
目录:
- 配置环境
- 实现cpp代码
- 实现pybind11的module
- 编译
- import
- 参考blog
创建自己的python扩展库-cpp扩展库
介绍
python速度太慢了,即便有很多库已经使用了c++接口,如果用python自己定义计算框架如渲染部分,很难优化速度。
用c++实现计算接口能非常高效的提升训练速度,如3dgs使用接口将3d渲染任务时间从几天降到几十分钟
很多项目的优化部分在接口部分,必须要能够了解接口库怎么实现才能在上面修改
流程
- 配置环境
- 实现cpp代码
- 实现pybind11的module
- 编译
- import
配置环境
linux下:gcc,cmake
win10:gcc,cmake,vs,mingw
pybind11测试
在https://github.com/pybind/pybind11 下载pybind11
在pybind11文件夹下,测试:
1 2 3 4 5
| chmod -R 777 . mkdir build cd build cmake .. cmake --build . --config Release --target check
|
程序没有终止就可以
include
把文件夹下pybind11/include加到环境变量中,方便导包
cpp接口
按照场景区分,一般需要接口的都是矩阵运算相关的操作,重点包括vector,matrix的实例化和计算。
一般函数
1 2 3
| int add(int a,int b){ return a+b; }
|
类(模板实例化)
pybind不支持指针参数,存在问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| template <typename T , int N> class CVector{ private: int size; public: std::vector<T> vec; CVector(); CVector(T* initdata); CVector mul(CVector& other) const; T dot (CVector& other) const; ~CVector(); };
template <typename T,int N> CVector<T,N>::CVector(){} template <typename T,int N> CVector<T,N>::~CVector(){}
template <typename T,int N> CVector<T,N>::CVector(T* initdata){ for(int i=0;i<N;i++) this->vec[i]=initdata[i]; }
template <typename T,int N> CVector<T,N> CVector<T,N>::mul(CVector<T,N>& other) const{ CVector<T,N> result; for(int i=0;i<N;i++){ result.vec[i]=(this->vec[i])*(other.vec[i]); } return result; } template <typename T,int N> T CVector<T,N>::dot(CVector<T,N>& other) const{ T result=this->vec[0]*other.vec[0]; for(int i=1;i<N;i++){ result+=(this->vec[i])*(other.vec[i]); } return result; }
|
向量、矩阵运算实现-待写
pybind11绑定
需要头文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include "pybind11/pybind11.h"
PYBIND11_MODULE(cpplib,m){
m.doc()="cpplib extention powered by pybind11"; m.def("add",&add,pybind11::arg("a"),pybind11::arg("b"));
pybind11::class_<CVector<int, 3>>(m, "CVectorInt3") .def(pybind11::init<>()) .def(pybind11::init<int*>()) .def("mul", &CVector<int, 3>::mul) .def("dot", &CVector<int, 3>::dot);
}
|
编译
文件结构
1 2 3 4 5
| demo: --build:生成的部分 cpplib.h cpplib.cpp --pybind11:下载的文件夹
|
demo下创建CMakeLists.txt
1 2 3 4 5
| cmake_minimum_required(VERSION 3.4...3.18) project(cpplib LANGUAGES CXX)
add_subdirectory(pybind11) pybind11_add_module(cpplib cpplib.cpp)
|
linux下
1 2 3 4
| mkdir build cd build cmake .. make
|
win10下
对build下生成的cpplib.vcxproj编译(使用vs的MSBuild,生成在build/Release下面):
C:\VS\IDE\MSBuild\Current\Bin\MSBuild.exe cpplib.vcxproj /p:Configuration=Release
生成cpplib.xxxx.pyd
没有生成查看报错信息,程序存在问题
import导包
同目录下import测试包效果
参考blog
https://zhuanlan.zhihu.com/p/666269440
https://zhuanlan.zhihu.com/p/192974017