我想使用并行处理在两个嵌套循环中执行一个函数。该函数取一个整数(i)、1D数组(C)和2D数组(A&B)。当数组保持不变时,整数会在某些值上迭代。
我尝试了两种方法:
-
3个循环,第3个循环迭代执行函数。
-
2个循环,第3个循环替换为starmap()多处理函数。
这两种方法编译时都没有错误。但是starmap()方法的输出矩阵B2与常规循环的输出B1不匹配。此外,带有starmap()的循环似乎比常规循环花费更多的时间。下面是代码。
import numpy as np
from multiprocessing import Pool
import time
def function(i, A, B, C):
B[i,:] = B[i,:] + A[i,:] + 50*C[i]
return B
if __name__ == '__main__':
L1 = 10
L2 = 2
A = np.zeros([100, 100]) + 5
C = np.zeros([10]) + 10
# Regular 3 nested loops
start = time.time()
B1 = np.zeros([100, 100])
for f in range(L1):
for t in range(L2):
if (f>4):
for i in range(f):
res = function(i, A, B1, C)
B1 = res
print("Elapsed time: ~",f"{((time.time() - start)):.2f}","s")
# 2 nested loops and 1 parallelized
start = time.time()
B2 = np.zeros([100, 100])
for f in range(L1):
for t in range(L2):
if (f>4):
argslist = [(i, A, B2, C) for i in range(f)]
#res = []
with Pool(processes=4) as pool:
res = pool.starmap(function, argslist)
B2 = res[0]
print("Elapsed time: ~",f"{((time.time() - start)):.2f}","s")
print(B1)
print(B2)