这是我的问题Paralel for loop, map() works, pool.map() gives TypeError的后续内容。我想做multiprocessing.Pool.map(compare_clusters, clusters_1, clusters_2)
,其中compare_clusters是一个函数,clusters_1是一个对象列表,clusters_2也是一个对象列表。这个问题的answer清楚地表明,与map
不同,multiprocessing.Pool.map
只能使用一个迭代器,在这种情况下,clusters_2
必须是块大小。在
所以我的问题是,如何用两个迭代器并行化一个循环?在
代码
spectra_names, condensed_distance_matrix, index_0 = [], [], 0
for index_1, index_2 in itertools.combinations(range(len(clusters)), 2):
if index_0 == index_1:
index_0 += 1
spectra_names.append(clusters[index_1].get_names()[0])
try:
distance = 1/float(compare_clusters(clusters[index_1], clusters[index_2],maxiter=50))
except:
distance = 10
condensed_distance_matrix.append(distance)
我是如何把它平行化的
^{pr2}$
如果我正确地理解了您的代码,那么下面的代码应该可以工作
因此,与其创建包含单个集群的两个列表,不如创建一个包含集群对元组的列表。新列表中的每个对都是要比较的群集对。您可能需要相应地调整
compare_clusters
函数。在考虑到
Blckknght
的答案,您不需要迭代索引来创建itertools.combinations
的对列表。所以您可以只做pool.map(compare_clusters, itertools.combinations(clusters, 2))
,因为组合已经返回元组列表。在在Python3.3及更高版本中,可以使用
pool.starmap
。在早期版本中,您需要编写一个helper函数:我完全避免了索引,而是直接生成2元组的集群值,从而简化了许多事情。您根本不需要top
for
循环。我还将反转代码简化为一个列表理解,而不是一个每个项目调用一次append
的循环。在当然,您在循环中所做的另一件事是提取
^{pr2}$spectra_names
的值。与其一次只做一个索引,我建议使用列表理解一次性构建所有索引(它可以与上面的池内容分开):相关问题 更多 >
编程相关推荐