最后是一个我可以真正给出有价值答案的问题:)。
我为我的工作(光学测量技术博士)研究了 f2py、boost.python、swig、cython 和 pyrex。我广泛使用 swig,boost.python 和 pyrex 和 cython 很多。我也使用了ctypes。这是我的细分:
免责声明:这是我的个人经验。我没有参与任何这些项目。
swig:
不能很好地与 c++ 配合使用。应该,但是链接步骤中的名称修改问题是我在 linux 和 Mac OS X 上的一个主要问题。如果你有 C 代码并希望它与 python 接口,这是一个很好的解决方案。我根据需要包装了 GTS,并且需要编写一个可以连接到的 C 共享库。我不会推荐它。
Ctypes:
我使用 ctypes 编写了一个 libdc1394(IEEE 相机库)包装器,这是一次非常直接的体验。您可以在https://launchpad.net/pydc1394上找到代码。将标头转换为 python 代码需要做很多工作,但是一切都可以可靠地工作。如果您想连接外部库,这是一个好方法。Ctypes也在python的stdlib中,所以每个人都可以马上使用你的代码。这也是在 python 中快速使用新库的好方法。我可以推荐它来连接外部库。
Boost.Python:非常愉快。如果你已经有自己的 C++ 代码想要在 python 中使用,那就去吧。通过这种方式将 c++ 类结构转换为 python 类结构非常容易。如果你在 python 中有需要的 c++ 代码,我推荐它。
Pyrex/Cython:使用 Cython,而不是 Pyrex。时期。Cython 更先进,使用起来更愉快。如今,我用 cython 做所有我过去用 SWIG 或 Ctypes 做的事情。如果您的 python 代码运行速度太慢,这也是最好的方法。这个过程非常棒:你将你的 python 模块转换成 cython 模块,构建它们并像它仍然是 python 一样继续分析和优化(不需要更改工具)。然后,您可以将尽可能多(或尽可能少)的 C 代码与您的 python 代码混合使用。这比用 C 重写应用程序的整个部分要快得多;你只重写内部循环。
时序:ctypes 的调用开销最高(~700ns),其次是 boost.python(322ns),然后是 swig(290ns)。Cython 具有最低的调用开销 (124ns) 和最好的反馈(cProfile 支持!)。这些数字来自我的盒子,它调用了一个从交互式外壳返回整数的简单函数;因此,模块导入开销不是定时的,只有函数调用开销是定时的。因此,通过分析和使用 cython 来快速获取 python 代码是最简单和最高效的。
摘要:对于您的问题,请使用 Cython ;)。我希望这个纲要对某些人有用。我很乐意回答任何剩余的问题。
编辑:我忘了提:出于数字目的(即连接到 NumPy)使用 Cython;他们对此有支持(因为他们基本上为此目的开发了cython)。所以这应该是您决定的另一个+1。