16

我知道有很多方法可以将 C 函数连接到 Python:Python C APIscipy.weavectypespyrex/cythonSWIGBoost.PythonPsyco ……它们各自最适合什么?为什么我应该使用给定的方法而不是其他方法?当我需要在 Python 和 C 之间选择绑定时应该考虑什么?

我知道一些关于此的讨论,但它们似乎都不完整......

我知道 StackOverflow 上的一些问题也是相关的。例如:

4

2 回答 2

9

我没有使用所有这些方法,尽管我曾在某一时刻对它们进行过调查......

Python C API:用于编写可编译为可在 Python 中导入的 Python 模块的 C 代码。或者用于编写充当“胶水”代码以与某些 C 库交互的 Python 模块。

scipy.weave:允许您将 C 代码位放入您的 python 代码中,如果您使用 NumPy 和 SciPy 进行数字工作,请查看此内容。C 代码将是一个字符串,例如 weave.inline('printf("%s", foo)')。

ctypes:一个 python 模块,允许您从 python 代码调用 C 代码。您基本上导入共享库,然后调用其 API。需要做一些工作来编组这些调用中的数据。如果您正在考虑使用您或其他人编写的现有 C 库,我将从这里开始。

pyrex/cython:允许您编写 Python 代码(使用一些特殊语法),这些代码将生成为 C 代码(可以作为 Python 模块导入),并且显然比通过 Python 解释器运行更快。这有点像“Python C API”路线,只是它为您生成 C 代码。如果你有一些代码块是你的瓶颈并且真的很慢,这很有用。使用 cython 重写该函数并从调用代码中导入它。

SWIG:为 C/C++ 库生成包装器代码。您应该最终得到一个可以导入和使用的 python 模块。

Boost.Python:这是我最不了解的一个。在我看来,它与 SWIG 类似,尽管您自己编写了包装层,但是在 Boost 宏/函数的帮助下。

Psyco:稍微加快你的 python 代码,我从来没有这么幸运过。我不会浪费你的时间。分析您的代码,找到您的瓶颈并使用上述技术之一加速它们。

于 2011-07-05T20:54:09.210 回答
4

这只是对部分问题的简要回答,但是:

ctypes当您有一个要与 Python 一起使用的预先存在的 C 库时,这可能是最好的选择。

当您想用 C 语言编写一些利用 Python 方面的东西,或者想用 C 语言编写 Python 扩展时,Python C API 是最好的选择。(Cython 是另一种实现方式。)

当然,在您在问题中链接到的 SO 问题的一些答案中,可能会更详细地阐述这两者。

于 2011-07-05T20:15:56.220 回答