我正在重新表述我的问题,因为我认为很多人认为这是一个“python有线程”的问题。确实如此,但CPython也有GIL,它不会在任何给定时间调度多个线程。这使得CPython线程在cpu密集型计算中毫无用处。
我需要使用线程;由于IPC成本(我有大型共享对象),进程并行性对我不起作用。
我目前在JyNI中使用Jython (没有GIL),这样我就可以使用numpy了。JyNI是alpha,但现在它确实支持numpy。我把这个搞定了。然而,JyNI是阿尔法和缺陷,整个过程是缓慢的。
我读过一堆旧线索。我想知道从那以后是否有可行的选择?我被迫使用python 2.7。
谢谢。
发布于 2018-08-04 03:04:52
目前,Jython仍然比CPython慢得多。根据程序和JIT能够优化它的程度,多线程可能有效果,也可能没有回报。Jython的主要设计目标是兼容性,而不是性能。它主要用于胶水代码,仍然有很大的提高效率的潜力。例如,查看zippy获得Java中速度惊人的Python实现,但是它是实验性的,缺乏Jython的兼容性水平。在某种程度上,这代表了相反的设计目标。
现在,将JyNI添加到Jython并不能使它更快,但到目前为止,我发现在JyNI中进行性能优化还为时过早,而且通常Jython部分控制运行时。另外,对于NumPy来说,本地的数字工作负载极大地控制了胶水代码的成本。
最后,请注意,JyNI必须在C端模拟GIL。要了解详细信息,请看一看报纸https://arxiv.org/abs/1607.00825。也许可以在没有GIL的情况下操作某些扩展--这取决于实现细节,扩展对此有多敏感。目前C端吉尔是强制性的。这就是为什么在使用NumPy时可能无法从Java多线程中获益的原因。C-扩展可以选择显式释放GIL,例如在计算密集的操作期间,这些操作不与解释器交互。我不知道NumPy是否利用了这个。
JyNI是阿尔法和巴基
请务必在问题跟踪器上报告错误。
https://stackoverflow.com/questions/47090816
复制相似问题