Python-C集成:Ctypes、CFFI或创建二进制模块

13
基本上,我想让一个Python程序调用用C语言编写的函数。据我所知,我的选择有以下几种:
  • CTypes/CFFI
    • 创建一个包含C函数的DLL/SO/DyLib,并使用CTypes或CFFI访问它们。显然,CFFI速度更快,唯一的缺点是必须在Python中声明所有函数签名。
    • 优点:
      • 不需要对我的C函数进行任何适配。所有类型转换都在Python中完成。
    • 缺点:
      • 性能?
  • Python二进制模块
    • 用C编写Python接口,将我的C模块转换为二进制Python模块
    • 优点:
      • 性能?
    • 缺点:
      • 所有类型转换都在C中完成。使用[SIP][3]可能可以自动化。

将C模块转换为Python二进制模块真的更快吗?

这两种解决方案都支持将Python回调发送到C函数吗?

SIP是否是生成Python接口的好选择?还有其他选项吗?

它们中是否有任何其他特殊性?


1个回答

1
我刚刚在回顾我发布的与此相关的选项列表: http://stromberg.dnsalias.org/~strombrg/speeding-python/ 如果你只针对CPython(2.x或3.x),我可能会选择Cython。
如果你想在Pypy上运行,CFFI可能很好;我还没有尝试过,但听起来很不错。它并不完全像ctypes——ctypes更像ABI级别,而CFFI更像API级别——这很好。
如果你想在Jython上运行,subprocess可能是最好的选择。

2
C语言函数已经编写完成,有大量稳定的代码。我只是想找一种方法在Python中使用它们。 - romulof
很有趣,尽管我的建议可能仍然适用。 - dstromberg
据说 ctypes 在 Python<->C 边界处的性能较慢。他们已经在 Pypy 中针对某些常见用法进行了优化。 - dstromberg
1
我在本周的pyconuk上被告知,现在使用cffi比使用ctypes更快,特别是对于像OpenGL这样的应用程序,在其中构造C类型的数组,然后频繁修改它们的切片并重新发送给C驱动程序。 - Jonathan Hartley
你还需要考虑你的开发平台。Linux没有问题,但Windows只限于一个特定的CFFI编译器。如果你选择在Windows上使用CFFI,你将不得不检查编译器与任何其他包的兼容性。 - cup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接