微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

代码在单 CPU 上更快,但在多个进程上很慢,为什么?

如何解决代码在单 CPU 上更快,但在多个进程上很慢,为什么?

我有一些代码可以对最初在稀疏矩阵中的一些值进行排序,并将其与另一个数据压缩在一起。我使用了某种优化来使它更快,代码比下面的代码快 20 倍:

这段代码在单核 cpu 上耗时 8 秒:

 # 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 举报,一经查实,本站将立刻删除。