简单易行的将独立循环分解为并行线程/进程的方法
- 我有一段需要大量计算的循环,这些计算是独立的,我想利用多核处理器来加速它们:也就是说,所有的计算可以同时进行。用Python实现这个的最简单方法是什么?
- 假设这些计算最后需要求和。怎么简单地把它们加到一个列表或者一个浮点数变量里呢?
感谢大家的耐心解答和使用Python库的建议;o)
2 个回答
1
在CPython中,使用多核处理有点困难,这主要是因为有个叫做全局解释器锁(GIL)的东西。不过,Python提供了一个多进程(multiprocessing)模块,可以让你用子进程(而不是线程)来把工作分配到多个核心上。
这个模块使用起来相对简单,只要你的代码可以真正分成多个部分,并且不依赖共享的对象。链接中的文档应该是一个不错的起点。
12
根据我的经验,多线程可能并不是加速的好办法,因为有个叫做全局解释器锁的东西在作怪。
一个不错的替代方案是multiprocessing
模块。这个模块的效果好不好,主要看你需要在不同进程之间传递多少数据。
另一个好的选择是考虑使用numpy
来进行计算(如果你还没有用的话)。如果你能把代码向量化,那么即使在单个核心上,你也能获得显著的速度提升。具体效果还要看你在做什么,以及你使用的numpy
版本,可能它甚至能自动把计算分配到多个核心上。
编辑 这里有一个完整的例子,展示了如何使用multiprocessing
模块来进行简单的计算。这个例子用四个进程来计算从零到九的平方。
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
inputs = range(10)
result = pool.map(f, inputs)
print result
这个例子只是为了简单说明。由于f()
的计算非常简单,这个并行版本的速度几乎肯定会比串行计算要慢。