C(或C++)如何与Python接口的不同选项有哪些?

17 投票
2 回答
1632 浏览
提问于 2025-04-16 20:53

我知道有很多方法可以把C语言的函数和Python连接起来,比如说 Python C APIscipy.weavectypespyrex/cythonSWIGBoost.PythonPsyco……每种方法最适合用来做什么呢?我为什么要选择某种方法而不是其他的呢?在选择Python和C之间的连接方式时,有哪些需要考虑的因素呢?

我知道有一些讨论,但它们似乎都不够全面……

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

2 个回答

4

这只是对你问题的一部分的简要回答,不过:

ctypes 可能是最好的选择,当你有一个现成的 C 库,想要在 Python 中使用它的时候。

而 Python C API 则更适合当你想用 C 写一些可以利用 Python 特性的东西,或者想用 C 为 Python 编写扩展时。(Cython 也是一种实现这个的方式。)

当然,这两者在你提到的 Stack Overflow 问题的回答中可能会有更详细的解释。

9

我虽然没有用过所有这些方法,但我之前都研究过它们...

Python C API:这是用来写C代码的,编译后可以变成一个Python模块,方便在Python中导入。或者可以写一个Python模块,充当“胶水”代码,用来和某个C库进行连接。

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代码,但我用过后没什么效果。我觉得不值得浪费时间。最好先分析你的代码,找出瓶颈,然后用上面提到的技术来加速它们。

撰写回答