我已经阅读了几篇关于 Python 多处理的文章,但我不清楚如何使用它们来解决我的问题(我有多个输入和输出(。大多数可用示例都考虑了结构相当简单的单个输出函数。
这是 Python 中的代码:
import numpy as np
n = 1000
i1 = np.random.random(n)
i2 = np.random.random(n)
i3 = np.random.random(n)
i4 = np.random.random(n)
o1 = np.zeros(n)
o2 = np.zeros(n)
o3 = np.zeros(n)
def fun(i1,i2,i3,i4):
o1 = i1 + i2 + i3 + i4
o2 = i2*i3 - i1 + i4
o3 = i1 - i2 + i3 + i4
if o1 < o2:
o1 = o2
else:
o2 = o1
while o1 + o2 > o3:
o3 = o3 + np.random.random()
return o1,o2,o3
for i in range(n): # I want to parallellise this loop
o1[i],o2[i],o3[i] = fun(i1[i],i2[i],i3[i],i4[i])
我只是在寻找一种并行化for
循环的方法。我怎样才能做到这一点?
我将使用生成器将您的输入列表 i1 组合到 i4。您的数学函数fun
将返回一个列表对象。现在我有一个参数作为输入(生成器(,并获取一个对象作为输出(列表(。我已经尝试了下面的代码,它可以工作。
您可以在fun
函数中添加睡眠命令,以查看使用多个进程时的速度增益。否则,您的fun
函数太简单,无法真正从多处理中受益。
import numpy as np
from multiprocessing import Pool
n = 1000
i1 = np.random.random(n)
i2 = np.random.random(n)
i3 = np.random.random(n)
i4 = np.random.random(n)
def fun(a):
o1 = a[0] + a[1] + a[2] + a[3]
o2 = a[1]*a[2] - a[0] + a[3]
o3 = a[0] - a[1] + a[2] + a[3]
if o1 < o2:
o1 = o2
else:
o2 = o1
while o1 + o2 > o3:
o3 = o3 + np.random.random()
return [o1,o2,o3]
# a generator that fills the Pool input
def conc(lim):
n = 0
while n < lim:
yield [i1[n], i2[n], i3[n], i4[n]]
n += 1
if __name__ == '__main__':
numbers = conc(n)
with Pool(5) as p:
print(p.map(fun, numbers))