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

标签 python c python-c-extension python-sip python-cffi

基本上我想制作一个 Python 程序调用用 C 编写的函数。

所以(据我所知)我的选择是:

  • CTypes/CFFI
    • 创建包含 C 函数的 DLL/SO/DyLib 并使用 CTypes 或 CFFI 访问它们.显然 CFFI速度更快,唯一的缺点是必须在 python 中声明所有函数签名。
    • 优点:
      • 不必对我的 C 函数进行任何调整。所有类型转换均在 Python 中完成。
    • 缺点:
      • 表现 ?
  • Python 二进制模块
    • 用 C 编写一个 python 接口(interface),将我的 C 模块转换为二进制 python 模块
    • 优点:
      • 表现 ?
    • 缺点:
      • 所有类型转换都是用 C 语言完成的。使用 [SIP][3] 这可能是自动化的。

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

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

SIP 是生成 python 接口(interface)的好选择吗?还有其他选择吗?

它们还有其他特殊性吗?

最佳答案

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

如果您只针对 CPython(2.x 或 3.x),我可能会选择 Cython。

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

如果您也希望能够在 Jython 上运行,子进程可能是您最好的选择。

关于Python-C 集成 : Ctypes, CFFI 或创建二进制模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17755697/

相关文章:

python - ctypes.ArgumentError : Don't know how to convert parameter

python - 如何更改 python 的 "full name"(类似 `cpython-34m-x86_64-linux-gnu` )?

改变函数中的指针,c

在 C 中将字符串转换为 mpz_t

python - 系统命令的线程未并行运行

python - 用户输入给出 “ValueError: invalid literal for int() with base 10:”

c - 在 C 中使用按位运算符查找 x 是否大于 y

python - 如何在 Pyrex 中定义初始化的 C 数组?

javascript - 使用 Python 获取文档高度 $(document).height()

python - 从字符串列表写入 csv 时,如何在第一列上添加时间戳