代码之家  ›  专栏  ›  技术社区  ›  Karthik Rajan V

Python在嵌套循环中并行执行具有多个整数和数组参数的函数

  •  0
  • Karthik Rajan V  · 技术社区  · 2 年前

    我想使用并行处理在两个嵌套循环中执行一个函数。该函数取一个整数(i)、1D数组(C)和2D数组(A&B)。当数组保持不变时,整数会在某些值上迭代。

    我尝试了两种方法:

    1. 3个循环,第3个循环迭代执行函数。
    2. 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)
    
    0 回复  |  直到 2 年前