并行化耗时Python循环

j9per5c4  于 2022-11-28  发布在  Python
关注(0)|答案(1)|浏览(154)

我有一个非常耗时嵌套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个不同集群中每两个点之间的距离。但对于并行化,我不知道如何使用asynciojoblib。这些循环是否可行?

ykejflvf

ykejflvf1#

CPython实现详细信息:在CPython中,由于全局解释器锁,一次只能有一个线程执行Python代码(即使某些面向性能的库可能克服了这个限制)。如果你想让你的应用程序更好地利用多核机器的计算资源,建议你使用多处理或concurrent.futures.ProcessPoolExecutor。

相关问题