所以我正在做一个项目,要求我编写一些python代码来连接C / C ++程序,但我还没有决定应该使用哪个工具。直觉上,我想在pybind11和Boost.Python之间进行选择。程序员:两人之间的亲和关系是什么?你会如何决定使用哪一个?
答案 0 :(得分:1)
Boost.Python的设计考虑了两个主要目标:
PyObject*
值和参考计数。正如您所料,Boost.Python使用来自无数低级Boost库的Boost原语来实现这一点 - 它做得非常好:
我个人不喜欢使用Boost;如果你有类似的性格,并且能够为你的项目做出这种性质的执行决定,你可以得到我认为是Boost.Python C ++ API 的大部分而没有 Boost-如果使用pybind11 - 一个利用C ++ 11特性的新项目,重新实现伪Pythonic API所需的低级工具,则会产生依赖性开销。
TL; DR: pybind11为Boost.Python,适用于中度至重度Boost过敏的开发者。这两个工具都可以让您编写一个C ++层,通过一个或多个Python模块将您现有的API(可能是函数,类型,模板等)公开为类似的Python结构。
相比之下:Cython完全采用了不同的方法。 Cython提供了Python语言的超集,它还提供了允许C和C ++原语与相关Python数据结构一起直接操作的关键字。这是一种完全不同的方法,适用于两种(通常有些正交)用例:
...虽然这些是不同的任务,但通常会编写一个扩展来运行比单独使用Python更快的内容,因此使用Cython作为原因#1可以避免对#2的需求(无论使用哪种工具)使用)。
我喜欢Cython,但是当我知道C ++非常冷时,我发现它用于接口(使用#2)会有所改进。很容易拿起Cython并使用它来优化一些瓶颈的Python代码(使用#1),而不是专家的C-hacker或C ++ afficionato - 但是,IMO并没有扩展到Cythonic接口。
这当然是一种非常主观的评估 - 邀请提问者用这些框架做一些示例程序,并得出他或她自己的结论。