简单易行的将独立循环分解为并行线程/进程的方法

5 投票
2 回答
9585 浏览
提问于 2025-04-16 21:16
  1. 我有一段需要大量计算的循环,这些计算是独立的,我想利用多核处理器来加速它们:也就是说,所有的计算可以同时进行。用Python实现这个的最简单方法是什么?
  2. 假设这些计算最后需要求和。怎么简单地把它们加到一个列表或者一个浮点数变量里呢?

感谢大家的耐心解答和使用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()的计算非常简单,这个并行版本的速度几乎肯定会比串行计算要慢。

撰写回答