所以我正在做一个项目,需要我编写一些 python 代码来接口 C/C++ 程序,但我还没有决定我应该使用哪个工具。直观地说,我想在pybind11和Boost.Python之间进行选择。程序员:两者的优缺点是什么?您将如何决定使用哪一个?
1 回答
据我所知, Boost.Python的设计有两个主要目标:
- 为专业 Python C++ 开发人员提供 C++ 中的“pythonic”API 用于扩展开发——例如
- ......这个 API 的架构师会尽最大努力将其目标开发者用户群与底层 Python C-API的实现细节隔离开来——具体来说,他们不希望用户必须操纵
PyObject*
值和引用计数。
如您所料,Boost.Python使用来自无数低级 Boost 库的 Boost 原语来完成此任务——它做得很好:
- 如果您的项目已经开始使用 Boost,
- 98% 的可以想象的 Python 到 C++ 用例。
我个人不喜欢使用 Boost。如果您具有类似的性格并且能够为您的项目做出这种性质的执行决策,那么如果您使用pybind11,您可以获得我认为的 Boost.Python C++ API 的绝大多数而没有Boost 依赖开销–一个利用 C++11 特性的较新项目,重新实现了伪 Pythonic API 所需的低级工具。
TL;DR: pybind11是Boost.Python,适用于对中度至重度 Boost 过敏的开发人员。这两种工具都可以让你编写一个 C++ 层,通过一个或多个 Python 模块将现有的 API(可能是函数、类型、模板等)公开为类似的 Python 结构。
相比之下:Cython完全使用了不同的方法。Cython 提供了 Python 语言的超集,它还提供了关键字,允许直接操作 C 和 C++ 原语以及相关的 Python 数据结构。这是一种完全不同的方法,适用于两个(通常有些正交的)用例:
- 通过明智地将“热门”惯用语从解释的 Python 域移到本地编译的 Cython 域来优化 Python 代码;和
- 为预先存在的 C 或 C++ 库提供 Python 接口。
…虽然这些是不同的任务,但通常编写扩展程序是为了比单独在 Python 中运行的速度更快,因此出于原因 #1 使用 Cython 可以消除对 #2 的需求(无论使用何种工具)。
我喜欢 Cython,但我发现当一个人非常了解 C++ 时,它用于接口(使用 #2)会有所改进。拿起 Cython 并使用它来优化一些瓶颈的 Python 代码(使用 #1)非常容易,而无需成为专家 C 黑客或 C++ 爱好者——但是,IMO 并没有扩展到 Cythonic 接口。
当然,这是一个高度主观的评估——邀请提问者使用这些框架做一些示例程序,并得出他或她自己的结论。