我改写我的问题,因为我认为很多人认为这是“ python有线程”的问题。可以,但是CPython还具有GIL,该GIL在任何给定时间都不会调度多个线程。这使得CPython线程无法用于CPU密集型计算。

我需要使用线程;由于IPC成本(我有大量共享对象),进程并行性对我不起作用。

我目前正在将Jython(无GIL)与JyNI一起使用,以便可以使用numpy。 JyNI是Alpha,但现在支持numpy。我有这个工作。但是,JyNI是Alpha和越野车,整个过程很慢。

我读了一堆旧线程。我想知道从那以后是否有可行的选择?我被迫使用python 2.7。

谢谢。

最佳答案

目前,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和越野车


请确保在问题跟踪器中报告错误。

关于python - 逃避GIL的Python线程并行化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47090816/

10-12 23:05