我有一个非常耗时嵌套for循环。我认为并行化可以使它更快,但我不知道如何使用它。这是我代码中的for循环:
for itr2 in range(K):
tmp_cl=clusters[itr2+1]
if len(tmp_cl)>1:
BD_cent=np.zeros((len(tmp_cl),1))
for itr3 in range(len(tmp_cl)):
sumv=0
for itr5 in range(len(tmp_cl)):
condition = psnr_bitrate == tmp_cl[itr3,:]
where_result = np.where(condition)
tidx1 = where_result[0]
condition = psnr_bitrate == tmp_cl[itr5,:]
where_result = np.where(condition)
tidx2 = where_result[0]
BD_R=bd_rate(rate[tidx1[0],:],tmp_cl[itr3,:],rate[tidx2[0],:],tmp_cl[itr5,:])
BD_R=(BD_R-min_BDR)/(max_BDR-min_BDR)
BD_Q=bd_PSNR(rate[tidx1[0],:],tmp_cl[itr3,:],rate[tidx2[0],:],tmp_cl[itr5,:])
BD_Q=(BD_Q-min_BDQ)/(max_BDQ-min_BDQ)
value=(wr*BD_R+wq*BD_Q)
if value!=np.NINF:
sumv+=(value)
else:
sumv+=1000#for the curve which has not overlap with others
BD_cent[itr3]=sumv/len(tmp_cl)
new_centroid_index=np.argmin(BD_cent)
centroid[itr2]=clusters[itr2+1][new_centroid_index]
我在Stackoverflow中查看了一些其他关于并行化的示例,但作为一个初学者,我不明白解决方案是什么。我是否必须为for循环中的代码定义一个函数?该for循环计算K=6个不同集群中每两个点之间的距离。但对于并行化,我不知道如何使用asyncio
或joblib
。这些循环是否可行?
1条答案
按热度按时间ykejflvf1#
CPython实现详细信息:在CPython中,由于全局解释器锁,一次只能有一个线程执行Python代码(即使某些面向性能的库可能克服了这个限制)。如果你想让你的应用程序更好地利用多核机器的计算资源,建议你使用多处理或concurrent.futures.ProcessPoolExecutor。