Joblib 需要比简单循环更长的时间

时间:2021-07-24 09:36:11

标签: python parallel-processing joblib

我正在尝试使用 joblib 并行运行循环。这些循环在一个 3D 数组上运行,其中第四个循环对每个 2D 元素执行操作。我尝试并行运行一个循环比单循环方法花费的时间更长。我做错了什么?

没有joblib

import numpy as np
from joblib import Parallel, delayed
import multiprocessing

t = time.time()
repS=int(20)
arr_  = np.random.rand(3,3,20)
out_2_ = np.full([3,3,20], np.nan)

for p in range(20): 
    for trA in range(3): 
        for trB in range(3): 
            temp = np.full([repS, 1], np.nan)        
            uAB = np.concatenate((arr_[trA,:,p], arr_[trB,:,p]))
            for rr in range(repS):                
                rInd = np.random.randint(np.size(uAB,0), size=(np.size(uAB,0), 1))
                temp2=np.array([uAB[rInd[0:int(np.size(uAB,0)/2):1]]])
                temp[rr] = np.sqrt(np.mean(temp2**2))                        
            out_2_[trA,trB,p] = np.percentile(temp,42)
timeNL = time.time() - t

使用joblib

import numpy as np
from joblib import Parallel, delayed
import multiprocessing

t = time.time()
repS=int(20)
arr_  = np.random.rand(3,3,20)
out_2_ = np.full([3,3,20], np.nan)

for p in range(20): 
    for trA in range(3): 
        for trB in range(3): 
            temp = np.full([repS, 1], np.nan)  
            uAB = np.concatenate((arr_[trA,:,p], arr_[trB,:,p]))      
            if __name__ == '__main__':
                def segment(rr):                        
                        rInd = np.random.randint(np.size(uAB,0), size=(np.size(uAB,0), 1))
                        temp2=np.array([uAB[rInd[0:int(np.size(uAB,0)/2):1]]])
                        out_ = np.sqrt(np.mean(temp2**2))
                        return out_
                temp = Parallel(n_jobs=-1)(delayed(segment)(rr) for rr in range(repS))               
            out_2_[trA,trB,p] = np.percentile(temp,42)
timeL = time.time() - t

1 个答案:

答案 0 :(得分:0)

您正在调用多个 (20*3*3) 作业库并行进程,因此启动和协调这些进程的开销超过了并行处理所节省的时间。

相反,尝试列出要处理的作业(p、trA、trB)并对其进行并行处理。

相关问题