我开始使用joblib并行化一些long for循环,它总是打印出结果数组,而我想将其保存在变量中,并在代码的另一部分中使用它。这是我的函数和并行化,如何存储生成的数组?文件对我来说不太清楚
def CurrentStepbyStep(gap1, gap2, R, runTime, steps, Vdc, Vac, omegaAC, k,):
time = runTime
volt = Vdc + Vac*np.cos(k*omegaAC*time/steps)
phasediff = (2*e*Vdc*k*time/(hbar*steps)) + (2*e*Vac/(hbar*omegaAC))*np.sin(k*omegaAC*time/steps)
ij1 = (np.real(j2(gap1,gap1, (e*volt/hbar) ,R)))
ij2 = (- np.imag(j2(gap1,gap1, (e*volt/hbar) ,R)))
iqp = ( np.imag(j1(gap1,gap1, (e*volt/hbar) ,R)))
sineCurr = ij1*np.sin(phasediff)
cosineCurr = ij2*np.cos(phasediff)
totCurr = sineCurr + cosineCurr + iqp
return [volt,phasediff,ij1,ij2,iqp,sineCurr,cosineCurr,totCurr]
n=5
xsize = 50
steps = 100
Vdc_arr = np.linspace(-n*V_dc,n*V_dc, xsize)
backend = 'loky'
run = Parallel(n_jobs=4,backend = backend)(delayed(CurrentStepbyStep)(gapvar,gapvar2,Rn,(10**(-6)),steps,x,V_ac,omega_ac,i) for i in range(steps) for x in Vdc_arr)
事实#0:
您的函数效率低下,并且可能很容易(取决于隐藏
j1(), j2()
函数的实际计算成本)代表几乎一个Amdahl's Law antipattern(您在每个和所有开销设置/通信/终止成本上支付的费用比您从4进程中收到的任何回报都要多joblib.Parallel()(delayed())
代码执行片段)。实际的附加成本是HPC/低延迟计算问题的主要敌人一个想要加速的人实际上很快就会变慢。
事实#1:
您的函数不会返回它返回的任何数组。实例:
证明:
Q.E.D
接下来,检查这个
list
-实例,实际上收到了一个list_of_lists
:可能的解决办法:
当然,
或者重构代码,以便将所有单个的
list
-项直接放入一个数组中(使用标准的numpy.array( fromList_or_Array_like_INSTANCE, dtype = None, copy = True, order = 'K', subok = False, ndmin = 0)
作为执行此操作的最后手段),或
继续返回一个
list
-实例,并对收集的joblib.Parallel()(delayed())
列表进行后期处理,如上所示Q.E.D
(原样)状态,在任何基于性能的重新分解之前:
生成用于Python进程的解释代码:
相关问题 更多 >
编程相关推荐