我有一段看起来像这样的代码:
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是我要并行化的数组/可迭代。
谢谢。
答案 0 :(得分:2)
一种选择是使用itertools.repeat
和zip
(或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
返回的函数会将任何参数附加到现有的参数列表中。