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,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,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,np.nan)  
            uAB = np.concatenate((arr_[trA,p]))      
            if __name__ == '__main__':
                def segment(rr):                        
                        rInd = np.random.randint(np.size(uAB,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,42)
timeL = time.time() - t

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...