所以我正在做一个项目,需要我写一些python代码来接口C/c++程序,但我还没有决定我应该使用哪个工具。直觉上,我想在pybind11和Boost.Python之间做出选择。程序员:这两者的优缺点是什么?你如何决定使用哪一个?
据我所知,Python的设计有两个主要目标:
- 为支持python的c++开发人员提供c++中的"python"API,用于扩展开发-例如 这个API的架构师会尽可能地将其目标开发人员用户群与底层Python C-API的实现细节隔离开来——具体来说,他们不希望用户必须操纵
PyObject*
值和引用计数。如您所料,Boost。Python使用来自无数低级Boost库的Boost原语来实现这一点——它做得很好:
- 如果你的项目已经开始使用Boost,
- 适用于98%的python -to- c++用例。
我个人不喜欢使用Boost;如果你也有类似的性格,并且能够为你的项目做出这种性质的行政决策,你就可以得到我认为是最重要的提升。如果您使用pybind11(一个利用c++ 11特性的新项目,重新实现伪Python API所需的低级工具),则Python c++ API 没有 boost依赖开销。
TL;DR: pybind11 is 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++爱好者-但是,在我看来,这并不扩展到Cythonic接口。
当然,这是一个非常主观的评估——提问者被邀请用这些框架做一些示例程序,并得出他或她自己的结论。