2013-07-19 87 views
6

基本上我想要用C编写的Python-C集成:ctypes的,CFFI或创建二进制模块

所以Python程序调用函数(据我所知),我的选择是:

  • ctypes的/ CFFI
    • 创建一个DLL/SO/DyLib含有C函数和使用ctypes的或CFFI访问它们。显然CFFI是更快的方法,唯一的缺点是必须在python中声明所有的函数签名。
    • 优点:
      • 不要做任何适应在我的C函数。所有的类型转换都是用Python完成的。
    • 缺点:
      • 性能?
  • Python的二进制模块
    • C编写一个Python接口,转换我的C模块转换成二进制Python模块
    • 优点:
      • 性能?
    • 缺点:
      • 所有类型转换在C.使用[SIP] [3],这可能是自动化的完成。

转换C模块为蟒蛇二进制模块是真的快?

这两种解决方案是否都支持向C函数发送python回调函数?

SIP是一个很好的选择来生成一个Python接口?还有其他选择吗?

其中有没有其他特点?

+1

找到了一些很好的东西:[使用Python与本地代码的5种方式](http://kos.gd/2013/01/5-ways-to-use-python-with-native-code/),[ Python包装工具:A 性能研究](http://web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf) – romulof

回答

1

我只是审查选项的旧列表我发布与此相关的: http://stromberg.dnsalias.org/~strombrg/speeding-python/

如果您只指定CPython的(x或3 x),我可能会去用Cython。

如果你想能够在Pypy上运行,CFFI可能是好的;我还没有尝试过,但听起来不错。虽然它不完全像ctypes - ctypes更多ABI级别,而CFFI更多API级别 - 这很好。

如果你想能够在Jython上运行,子进程可能是你最好的选择。

+1

C函数已经书面。吨稳定的代码。 我只是寻找一种方法,然后在Python中使用。 – romulof

+0

这很有趣,尽管我的建议可能仍然适用。 – dstromberg

+0

假设ctypes在python <-> C边界处很慢。他们已经为Pypy中的一些常见用途进行了优化。 – dstromberg