2

これは、 Paralel for loop, map() works, pool.map() gets TypeErrorの質問からのフォローアップです。ここで、 compare_clustersmultiprocessing.Pool.map(compare_clusters, clusters_1, clusters_2)は関数、clusters_1 はオブジェクトのリスト、clusters_2 もオブジェクトのリストです。その質問に対する答えは、とは異なりmapmultiprocessing.Pool.map は 1 つのイテレータしかとることができず、この場合clusters_2はチャンク サイズでなければならないことを明らかにしました。

私の質問は、ループを 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)

並列化しようとした方法

from multiprocessing import Pool
condensed_distance_matrix, spectra_names, index_0, clusters_1, clusters_2 = [], [], 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])
    clusters_1.append(clusters[index_1])
    clusters_2.append(clusters[index_2])
pool = Pool()
condensed_distance_matrix_values = pool.map(compare_clusters, clusters_1, clusters_2)

for value in condensed_distance_matrix_values :
    try:
        distance = 1/float(value)
    except:
        distance = 10
    condensed_distance_matrix.append(distance)
4

2 に答える 2

2

あなたのコードを正しく理解していれば、次のように動作するはずです

from multiprocessing import Pool
condensed_distance_matrix = []
spectra_names = []
index_0 = 0
cluster_pairs = []
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])
    cluster_pairs.append((clusters[index_1], clusters[index_2]))
pool = Pool()
condensed_distance_matrix_values = pool.map(compare_clusters, cluster_pairs)

for value in condensed_distance_matrix_values :
    try:
        distance = 1/float(value)
    except:
        distance = 10
    condensed_distance_matrix.append(distance)

したがって、1 つのクラスターを含む 2 つのリストを作成する代わりに、クラスター ペアのタプルを含むリストを 1 つ作成します。新しいリストの各ペアは、比較するクラスター ペアです。compare_clustersおそらく、それに応じて機能を調整する必要があります。

の答えを考慮に入れるBlckknghtと、インデックスを繰り返し処理して、目的のペアのリストを作成する必要はありませんitertools.combinationspool.map(compare_clusters, itertools.combinations(clusters, 2))組み合わせはすでにタプルのリストを返しているので、そうすることができます。

于 2013-10-23T12:53:22.943 に答える