使用不同的Python工具接口C / C ++

时间:2016-09-16 22:25:53

标签: python c++ cython boost-python pybind11

所以我正在做一个项目,要求我编写一些python代码来连接C / C ++程序,但我还没有决定应该使用哪个工具。直觉上,我想在pybind11Boost.Python之间进行选择。程序员:两人之间的亲和关系是什么?你会如何决定使用哪一个?

1 个答案:

答案 0 :(得分:1)

据我所知,

Boost.Python的设计考虑了两个主要目标:

  1. 为亲C ++开发人员提供C ++中用于扩展开发的“pythonic”API - 这样
  2. ...这个API的架构师会尽可能地努力将其目标开发人员用户群与underlying Python C-API的实现细节隔离开来 - 具体而言,他们不希望用户必须操纵PyObject*值和参考计数。
  3. 正如您所料,Boost.Python使用来自无数低级Boost库的Boost原语来实现这一点 - 它做得非常好:

    1. 如果您的项目已经购买了使用Boost,
    2. 对于98%的可想象的Python-to-C ++用例。
    3. 我个人不喜欢使用Boost;如果你有类似的性格,并且能够为你的项目做出这种性质的执行决定,你可以得到我认为是Boost.Python C ++ API 的大部分而没有 Boost-如果使用pybind11 - 一个利用C ++ 11特性的新项目,重新实现伪Pythonic API所需的低级工具,则​​会产生依赖性开销。

      TL; DR: pybind11Boost.Python,适用于中度至重度Boost过敏的开发者。这两个工具都可以让您编写一个C ++层,通过一个或多个Python模块将您现有的API(可能是函数,类型,模板等)公开为类似的Python结构。

      相比之下:Cython完全采用了不同的方法。 Cython提供了Python语言的超集,它还提供了允许C和C ++原语与相关Python数据结构一起直接操作的关键字。这是一种完全不同的方法,适用于两种(通常有些正交)用例:

      1. 通过明智地将“热门”成语移出解释的Python域并进入本机编译的Cython域来优化Python代码;和
      2. 为预先存在的C或C ++库提供Python接口。
      3. ...虽然这些是不同的任务,但通常会编写一个扩展来运行比单独使用Python更快的内容,因此使用Cython作为原因#1可以避免对#2的需求(无论使用哪种工具)使用)。

        我喜欢Cython,但是当我知道C ++非常冷时,我发现它用于接口(使用#2)会有所改进。很容易拿起Cython并使用它来优化一些瓶颈的Python代码(使用#1),而不是专家的C-hacker或C ++ afficionato - 但是,IMO并没有扩展到Cythonic接口。

        这当然是一种非常主观的评估 - 邀请提问者用这些框架做一些示例程序,并得出他或她自己的结论。