我正在重述我的问题,因为我认为很多人认为这是“python有线程”的问题。它确实如此,但CPython也有GIL,它在任何给定时间都不会安排多个线程。这使得CPython线程对cpu密集型计算毫无用处。
我需要使用线程;因为IPC成本(我有大型共享对象),进程并行性对我不起作用。
我目前正在使用Jython(没有GIL)与JyNI,所以我可以使用numpy。 JyNI是alpha版,但它现在支持numpy。我得到了这个工作。然而,JyNI是alpha和buggy,整个过程很慢。
我读过一堆旧线程。我想知道从那以后是否有可行的选择?我被迫使用python 2.7。
感谢。
答案 0 :(得分:1)
目前,Jython仍然比CPython慢得多。根据程序以及JIT对其优化的程度,多线程可能会或可能不会奏效。 Jython的主要设计目标是性能之前的兼容性。它主要用于粘合代码,并且仍有大量提高效率的潜力。参见例如zippy可以在Java中实现极快的Python实现,但是它是实验性的,缺乏Jython的兼容性级别。在某种程度上,这代表了相反的设计目标。
现在将JyNI添加到Jython中并不能使它更快,但是到目前为止,我发现JyNI中的性能优化还为时过早,通常Jython部分仍在运行时中占主导地位。另外,例如对于NumPy,本机数字工作量在胶合代码成本中占主导地位。
最后,请注意,JyNI必须在C端模拟GIL。有关详细信息,请参见论文https://arxiv.org/abs/1607.00825。也许可以在没有GIL的情况下操作某些扩展-这取决于实现细节,扩展对此的敏感程度。目前,C端GIL是强制性的。这就是使用NumPy时可能无法从Java多线程中受益的原因。 C扩展名可以选择显式释放GIL,例如在不与解释程序交互的计算密集型操作中进行。我不知道NumPy是否利用了这个。
JyNI是Alpha和越野车
请确保在问题跟踪器中报告错误。