gpt4 book ai didi

python - 如何为 C++ 库实现 Python 接口(interface)

转载 作者:行者123 更新时间:2023-12-01 14:03:59 25 4
gpt4 key购买 nike

为 C++ 库创建 Python 接口(interface)的最佳/标准方法是什么?

我知道这个问题以前在这里被问过,但那是在 2008 年,从那时起事情可能/可能已经发生了变化。

我环顾四周并测试了几种不同的方法,但无法确定哪种方法最好。到目前为止,我已经尝试过 Swig、ctypes 和 cppyy,并且认为 cppyy 是迄今为止最容易/最快实现的。我已经看到了对 Swig 的建议,但是让 Swig 工作需要很长时间,结果并不令人印象深刻。有现行标准吗?为什么人们如此推荐 Swig 而我却没有听到 cppyy 的消息?谢谢你。

最佳答案

SWIG 自 1996 年 2 月以来一直存在,并支持多种语言,而不仅仅是 Python。尽管现在的 cppyy 始于 2003 年 2 月,作为 RootPython,它始终嵌入了 ROOT (http://root.cern.ch),并且不能独立使用。自今年 3 月以来,才在 PyPI 上为所有三个主要平台进行了完整、简单的轮子安装,而在 conda-forge(适用于 Linux 和 Mac)上仅在两个月后才出现。因此,尽管它有很长的谱系,但在更广泛的 Python 世界中,cppyy 确实非常新鲜,这就是为什么我怀疑很多人还没有听说过它,而 SWIG 是它们的(精神)祖先。

努力使 cppyy 可用的原因是它提供了很多其他绑定(bind)器没有的功能,并且不容易添加:兼容的 C++17 解析器(Clang/LLVM 的 b/c );自动模板实例化、交叉继承和回调,所有这些都在运行时(Cling 的 b/c);和更好的性能。它也不会创建 C 扩展模块,因此您只需为不同版本的 Python 重新编译 cppyy 本身,而无需绑定(bind)代码。

现在,你的第一个问题是什么是最好的。好吧,这取决于用例。例如,如果您需要更多的绑定(bind)而不仅仅是 Python,那么 SWIG 是您的最佳选择。如果您有很多无法在构建时全部实例化的模板,需要性能和可扩展性,或者有一个具有大量接口(interface)的 C++ 框架,那么 cppyy 很难被击败。如果您有现代 C++ 并且不希望对外部库有任何运行时依赖,那么 PyBind11 就是它所在的位置。

这些天我不能推荐ctypes。唯一真正的好处是它是大多数 Python 的内置模块,但随着 PyPI 和 conda 的出现,它变得毫无意义。如果你想要一个超轻量级的 C 绑定(bind)器(不是 C++,但你可以用 C 帮助程序包装这些函数),然后选择 CFFI。

至于您是否有标准的问题:不,没有一种粘合剂最适合所有用例。甚至比您提到的要多得多,但其中许多都在同一个空间中发挥作用(例如 SWIG 与 SIP,以及 PyBind11 与 boost.python),我不会推荐它们而不是您的那些已经试过了。我确实想指出 AutoWIG,它是一个使用 Clang 和 PyBind11 或 boost.python 代码作为输出的生成器;和 cython,它是一种类似 Python 的代码,用于编写 C 扩展模块,并且具有一些(有限的)C++ 支持。我一直觉得 cython 既不存在也不存在,但很多人都喜欢它,它在科学界和数学密集型代码中被广泛使用,因此证明了它的质量。

现在,即使没有“标准”,所有绑定(bind)器都可以将代理转换为 PyCapsule 对象并重新绑定(bind)它们。因此,尽管有时它有点笨拙,但您实际上可以在一个应用程序中混合活页夹。

最后一点:CFFI 和 cppyy(通过 CFFI 的后端)在 PyPy 上具有接近原生的性能。不幸的是,cppyy 在 PyPy 上不如在 CPython 上那么最新(例如,仍然缺少交叉继承),但它已经到了那里。其他绑定(bind)器通过 Python C-API 工作,该 API 在 PyPy 上具有完整功能,但会阻止 JIT 完成其工作,从而降低性能。

完全免责声明:我是 cppyy 的作者,这些天我只使用 cppyy、CFFI 和 PyBind11 来满足我的绑定(bind)需求。

关于python - 如何为 C++ 库实现 Python 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com