我试图在Python中并行运行像f
这样的函数,但有两个问题:
- 当使用
map
时,函数f
不适用于数组a
和b
的所有排列元组。 - 当试图使用
Pool
,我得到以下错误:
TypeError: '<=' not supported between instances of 'tuple' and 'int'
def f(n,m):
x = n * m
return x
a = (1,2,3,4,5)
b = (3,4,7,8,9)
result = map(f, a, b)
print(list(result))
#now trying parallel computing
from multiprocessing import Pool
pool = Pool(processes=4)
print(*pool.map(f, a, b))
我没有对您的#1问题进行任何更改,并从使用map()
获得预期的结果。你似乎对它的工作原理有一个不正确的假设,但没有为你的例子提供预期和实际结果。
对于#2,要返回与#1相同的答案,对于使用multiprocessing
的实例,需要使用starmap()
而不是map()
,然后使用zip()
参数列表来提供参数集。如果在没有fork
的操作系统上(为了可移植性,如果你是),只有当它是主进程时才运行全局代码,而不是使用if __name__ == '__main__':
习惯用法的派生进程:
from multiprocessing import Pool
def f(n,m):
x = n * m
return x
if __name__ == '__main__':
a = (1,2,3,4,5)
b = (3,4,7,8,9)
result = map(f, a, b)
print(list(result))
#now trying parallel computing
pool = Pool(processes=4)
print(*pool.starmap(f, zip(a, b)))
输出:
[3, 8, 21, 32, 45]
3 8 21 32 45
如果你真的想要在#1中提到的排列,使用itertools.starmap
或pool.starmap
与itertools.product(a,b)
作为参数代替。