可以在所有Python版本中使用的Python扩展(如Jython / IronPython等)
在“旧时代”,只有cpython的时候,大多数扩展都是用C语言写的(尽量做到平台无关),然后编译成pyd文件(比如PyCrypto就是一个例子)。现在有了Jython、IronPython和PyPy,而这些pyd文件在它们上面是无法使用的(除了Ironclad)。看起来它们都支持ctypes,可能最好的办法是创建一个平台无关的dll或共享库,然后用ctypes来连接它。
不过我觉得这种方法可能比以前的pyd方式要慢一些。你也可以为cpython编写一个pyd,为IronPython编写一个类似的C# dll,为Jython编写一个Java类或jar文件(我对PyPy不太确定)。但是虽然这种方法对平台的纯粹主义者来说很有吸引力,但它的工作量非常大。那么,今天最好的选择是什么呢?
2 个回答
1
如果你要把一个已经存在的本地库封装起来,使用ctypes绝对是个好方法。
如果你想加快Python扩展中的热点部分,那么为每个解释器制作一个自定义扩展(同时还要有一个纯Python的备用方案)是可行的,因为大部分代码都是可以共享的纯Python代码。不过,正如你所说的,这样做不太理想,而且工作量很大。在这种情况下,你也可以使用ctypes。
2
目前来看,ctypes确实是最好的方法。它现在可以正常工作,而且使用起来非常方便,未来可能会在很多地方被广泛应用。
不过,对于一些对性能要求很高的API(比如numpy),ctypes就有点问题了。最好的办法可能是把Cython移植过来,制作出原生的IronPython、Jython或PyPy扩展。
我记得PyPy曾计划把ctypes代码编译成高效的包装器,但根据我查的资料,目前还没有这样的东西出现...