问题描述
我正在尝试使用 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)并对其进行并行处理。