如何解决代码在单 CPU 上更快,但在多个进程上很慢,为什么?
我有一些代码可以对最初在稀疏矩阵中的一些值进行排序,并将其与另一个数据压缩在一起。我使用了某种优化来使它更快,代码比下面的代码快 20 倍:
# cosine_sim is a sparse csr matrix
# names is an numpy array of length 400k
cosine_sim_labeled = []
for i in range(0,cosine_sim.shape[0]):
row = cosine_sim.getrow(i).toarray()[0]
non_zero_sim_indexes = np.nonzero(row)
non_zero_sim_values = row[non_zero_sim_indexes]
non_zero_sim_values = [round(freq,4) for freq in non_zero_sim_values]
non_zero_names_values = np.take(names,non_zero_sim_indexes)[0]
zipped = zip(non_zero_names_values,non_zero_sim_values)
cosine_sim_labeled.append(sorted(zipped,key=lambda cv: -cv[1])[1:][:top_similar_count])
但是如果我在多核中使用相同的代码(使其更快),则需要 300 秒:
#split is array of arrays of numbers like [[1,2,3],[4,5,6]] it is meant to generate batches of array indexes to be processed with each paralel process
split = np.array_split(range(0,cosine_sim.shape[0]),cosine_sim.shape[0] / batch)
def sort_rows(split):
cosine_sim_labeled = []
for i in split:
row = cosine_sim.getrow(i).toarray()[0]
non_zero_sim_indexes = np.nonzero(row)
non_zero_sim_values = row[non_zero_sim_indexes]
non_zero_sim_values = [round(freq,key=lambda cv: -cv[1])[1:][:top_similar_count])
return cosine_sim_labeled
# this ensures paralel cpu execution
rows = Parallel(n_jobs=cpu_use,verbose=40)(delayed(sort_rows)(x) for x in split)
cosine_sim_labeled = np.vstack(rows).tolist()
解决方法
您是否意识到您的新并行函数 sort_rows
甚至不使用 split
参数?它所做的只是将所有数据分发到所有进程,这需要时间,然后每个进程都在做完全相同的计算,只是将整个数据返回给主进程,这又需要时间
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。