终于有一个问题可以让我真正地回答了 :).
我对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中尝试新的lib的好方法。我可以推荐它来接口化外部libs。
Boost.Python:非常愉快。如果您已经拥有自己的C++代码并希望在python中使用它,请选择它。这种方式非常容易将c++类结构转换为python类结构。如果你需要在python中使用c++代码,我推荐你使用它。
使用Cython而不是Pyrex。这是绝对正确的选择。Cython更先进,更易于使用。现在,我所做的一切都用Cython来完成,这与以前使用SWIG或Ctypes没有任何区别。如果你有些运行缓慢的Python代码,那么Cython就是最佳解决方案。整个过程绝对fantastic:你将你的Python模块转化成Cython模块,构建它们,并像使用Python一样进行性能分析和优化(无需改变工具)。然后,你可以添加尽可能多(或尽可能少)的C代码到你的Python代码中。这比必须重新编写应用程序的整个部分要快得多;你只需要重写内循环即可。
调用开销最高的是ctypes(约为700ns),其次是boost.python(约为322ns),然后直接是swig(约为290ns)。Cython的调用开销最低(约为124ns),并且花费时间最少。这些数字来自我的计算机,在交互式shell中调用一个返回整数的微不足道的函数;因此,导入模块的开销未计时,只计算了函数调用的开销。因此,通过分析和使用Cython来使Python代码变快最容易和有效。
总之,针对你的问题,请使用Cython ; )。希望这篇文章对某些人有用。我很乐意回答任何剩下的问题。
编辑:我忘记提到:对于数值目的(即与NumPy的连接),请使用Cython;他们为此提供支持(因为他们基本上是为这个目的开发Cython)。因此,这应该是你的决定另一个加分项。