使用multiprocessing.pool的python for循环并行化

时间:2015-06-18 20:13:56

标签: python-2.7 multiprocessing

我有一段看起来像这样的代码:

def calc_stuff(x,a,b,c):
    ...
    return y
x = range(N)
y = zeros(x.shape)
if __name__ == '__main__':
    p = Pool(nprocs)
    y = p.map(calc_stuff,x,a,b,c)

这不起作用,因为我在线搜索,这是因为map函数处理的是iterables而不是参数列表。我想知道修改此代码以使其并行化的最简单方法是什么,即x是我要并行化的数组/可迭代。

谢谢。

2 个答案:

答案 0 :(得分:2)

一种选择是使用itertools.repeatzip(或itertools.izip)将多个参数构建到可迭代的元组中,然后使用multiprocessing.Pool.starmap来调用函数将元组解压缩为参数:

from itertools import repeat

if __name__ == '__main__':
    p = Pool(nprocs)
    y = p.starmap(calc_stuff, zip(x, repeat(a), repeat(b), repeat(c)))

答案 1 :(得分:0)

查看functools.partial,它可以将函数与那些你不想迭代的必需参数转换成一个新函数。

from multiprocessing import Pool
import functools

def calc_stuff(a,b,c, x):
    return x+a+b+c

N = 10
x = list(range(N))
a = 1
b = 2
c = 3
if __name__ == '__main__':
    nprocs = 4
    p = Pool(nprocs)
    calc_stuff_p = functools.partial(calc_stuff, a, b, c)
    y = p.map(calc_stuff_p, x)
print(y)

结果

[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

请注意,您的可迭代x现在位于calc_stuff的最后,因为partial返回的函数会将任何参数附加到现有的参数列表中。