Python应该是算法工程师的老手艺了,优点就是方便快捷,适合个人手撸大项目,如果是别的语言,估计要造一堆脚手架才能干活。但缺点是太慢了,不能用它干多重循环的活。 有时候我们需要更高的性能,或者想要重用现有的C++库。这时,pybind11就派上用场了。pybind11是一个轻量级的库,它可以非常方便地将C++代码暴露给Python调用。
什么是pybind11?
pybind11是一个开源项目,它提供了一个高效的接口来将C++代码绑定到Python。它是一个头文件库,这意味着你不需要预先编译pybind11,只需要在你的项目中包含相应的头文件即可。
首先,你需要安装pybind11,pip安装就行:
|
|
或者,你也可以从源代码编译安装:
|
|
创建一个简单的C++函数
我们先写个简单的C++函数开始,创建一个名为example.cpp的文件:
|
|
这段代码定义了一个简单的函数add,它接受两个整数并返回它们的和。然后,我们使用PYBIND11_MODULE宏来创建一个Python模块,该模块绑定到add函数。
复习一下宏是啥,在 C++ 中,宏以 #define 开头,后面跟着宏的名称和宏的替换文本。当编译器遇到宏的名称时,会用宏的替换文本来替换宏的调用。比如下面这样:
|
|
PYBIND11_MODULE 是 Pybind11 库提供的一个宏,用于定义一个 Python 模块并将其与 C++ 中的函数、类等进行绑定。这个宏接受两个参数:模块名和模块变量名,所以它是个宏函数,它的实现可能是比较复杂的,因为宏函数还能调用其他函数。
总而言之PYBIND11_MODULE(example, m) 会被扩展为创建一个名为 “example” 的 Python 模块,并将其与 C++ 中的函数 add 进行绑定。
编译C++代码
为了编译这段代码,需要创建一个CMakeLists.txt文件,它告诉CMake如何构建项目。在同一目录下创建CMakeLists.txt文件,添加以下内容:
|
|
现在,你可以使用以下命令来构建模块:
|
|
这将在build目录下生成一个名为 example.so (在Linux和macOS上)或example.pyd(在Windows上)的共享库。
在Python中使用你的C++模块
现在你可以在Python中导入并使用你的C++模块了:
|
|
结论
使用pybind11,你可以轻松地将C++代码暴露给Python,这使得你可以在Python项目中利用C++的性能和现有库。这篇博客简要介绍了如何使用pybind11,但pybind11的功能远不止于此。它支持自定义类型转换、异常处理、智能指针等高级特性。如果你想了解更多,可以查看去问问chatgpt老师🧑🏫。