繁体   English   中英

从Python外部化CPU计算以实现多核并发

[英]Externalising CPU computation from Python for multi-core concurrency

我有一个PyQt5应用程序,该应用程序可以在我的开发计算机(Core i7 Windows 7)上完美运行,但是在目标平台(Linux Embedded ARM)上存在性能问题。 在“优化”当前代码之前(即确保所有UI代码在MainThread中,而所有逻辑代码在单独的线程中)之前,我一直在更详细地研究Python并发性。 我了解到,GIL在很大程度上阻止了CPython解释器实现真正的并发。

我的问题:使用IronPython或Cython作为解释器,还是将所有逻辑发送到可以利用多个内核的外部非Python函数,而让PyQt应用程序仅更新UI会更好吗? 如果是后者,哪种语言最适合高速并发计算?

如果是后者,哪种语言最适合高速并发计算?

您已经写了很多关于系统的文章,但是关于它的实际作用还不够; 您正在执行哪种“计算”? —如果您要进行大量的计算,很可能有人会非常努力地进行硬件优化的库来进行这类计算 ,例如通过scipy / numpy进行 BLAS(请参阅Arm自己的网站 )。 您希望将尽可能多的工作从自己的Python代码中移交给他们。 您用来调用这些库的语言的重要性要小得多。 对于此类库的这种“胶合”工作,Python已经很棒。 请注意,即使使用内置的Python函数(例如使用sum(value for value in some_iter)而不是在Python for循环中求和, sum(value for value in some_iter) 计算脱离缓慢的解释并进入高度优化的C代码

否则,如果不分析您的实际代码,很难说出什么是最好的。 通过以优化的库可以最好地完成其工作的方式(例如通过适当地向量化)有效地公式化计算来完成上述操作后,您可以使用Python的multiprocessing功能将导致瓶颈的Python逻辑与非瓶颈逻辑相区分。 ( 有关为什么multiprocesing通常比threading更好的信息,请参见此答案 )。 我敢打赌,这比将CPython换成另一个实现要有益得多。

只有将尽可能多的计算委派给外部库使用multiprocessing处理进行并行处理,然后我才能开始在Cython中编写这些繁重的计算过程,这可以被视为对上述架构的一种低级优化改进。

回显@errantlinguist,请注意,并行性能高度依赖于应用程序。

是的,要保持GUI响应能力,我将只使用一个单独的“工作者”线程来使主线程可用于处理GUI事件。

为了执行“并行并行”的操作(例如蒙特卡洛计算),您在其中执行了许多完全独立的任务,而这些任务之间的通信却很少,我可能会尝试进行多处理。

如果我正在做一些非常大的矩阵运算之类的事情,那我会做多线程的。 Anaconda会通过intel处理器上的MKL自动并行执行一些numpy操作(但这在ARM上无法帮助您)。 我相信如果您留在python中,可以看看numba这样的东西来帮助您。 如果您对性能不满意,则可以尝试使用C ++实现。 如果您几乎使用了所有向量化的numpy操作,则与使用C ++的区别不大,但是随着python循环等的开始,您可能会开始发现性能的巨大差异(超过最大4倍)通过在4个内核上并行化python代码)。 如果您切换到C ++进行矩阵运算,我强烈建议您使用Eigen库。 从高层次上来说,它非常快速且易于理解。

请注意,当您使用多线程时,通常是在共享内存环境中,这消除了您在多处理中会遇到的许多昂贵的io,但是它还引入了一些您在串行程序中不曾遇到的错误类(当两个线程开始访问相同的资源时)。 在多处理中,除了进程之间明确定义的通信外,内存通常是分开的。 从这种意义上讲,我发现多处理代码通常更易于理解和调试。

还有一些框架可以处理复杂的计算图,其中包含许多步骤,其中可能包括多线程和多处理(try dask )。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM