問題の設定に基づいて、辞書の入力リストをループする方法はありません。ただし、ここで適用できるマルチプロセッシングのトリックがあります。ここで
は、あなたの入力です:
dict_a = {'1': "U", '2': "D", '3': "D", '4': "U", '5': "U", '6': "U"}
dict_b = {'1': "U", '2': "U", '3': "D", '4': "D", '5': "U", '6': "D"}
dict_c = {'1': "U", '2': "U", '3': "U", '4': "D", '5': "U", '6': "D"}
dict_d = {'1': "D", '2': "U", '3': "U", '4': "U", '5': "D", '6': "D"}
other_dicts = [dict_b, dict_c, dict_d]
私はループ技術に使用するsimilarity2
機能に加えて、similarity1
ようgary_fixlerのマップ技術@含まれています。
def similarity1(a):
def _(b):
shared_value = set(a.items()) & set(b.items())
dict_length = len(a)
score_of_similarity = len(shared_value)
return score_of_similarity/dict_length
return _
def similarity2(c):
a, b = c
shared_value = set(a.items()) & set(b.items())
dict_length = len(a)
score_of_similarity = len(shared_value)
return score_of_similarity/dict_length
私たちはここ3つの技術を評価されています(3)ここでdicts
のリストをマルチプロセッシング
(1)@ gary_fixlerのマップ
dicts
のリストを(2)単純なループをしています実行文:
print(list(map(similarity1(dict_a), other_dicts)))
print([similarity2((dict_a, dict_v)) for dict_v in other_dicts])
max_processes = int(multiprocessing.cpu_count()/2-1)
pool = multiprocessing.Pool(processes=max_processes)
print([x for x in pool.map(similarity2, zip(itertools.repeat(dict_a), other_dicts))])
すべての3つのテクニックで同じ結果が得られます。
[0.5, 0.3333333333333333, 0.16666666666666666]
[0.5, 0.3333333333333333, 0.16666666666666666]
[0.5, 0.3333333333333333, 0.16666666666666666]
マルチプロセッシングでは、multiprocessing.cpu_count()/2
コア(各コアにハイパースレッディングがあります)があります。あなたのシステムで何も実行しておらず、プログラムにI/Oや同期の必要がないと仮定すると、multiprocessing.cpu_count()/2-1
プロセスでは最適なパフォーマンスが得られ、親プロセスでは-1
となることがよくあります。今
、時間に3つの技術:
print(timeit.timeit("list(map(similarity1(dict_a), other_dicts))",
setup="from __main__ import similarity1, dict_a, other_dicts",
number=10000))
print(timeit.timeit("[similarity2((dict_a, dict_v)) for dict_v in other_dicts]",
setup="from __main__ import similarity2, dict_a, other_dicts",
number=10000))
print(timeit.timeit("[x for x in pool.map(similarity2, zip(itertools.repeat(dict_a), other_dicts))]",
setup="from __main__ import similarity2, dict_a, other_dicts, pool",
number=10000))
これは私のラップトップ上で、次の結果を生成します。
0.07092539698351175
0.06757041101809591
1.6528456939850003
あなたは、基本的なループ技術は最高の性能が得られていることがわかります。プロセスの作成とデータの受け渡しのオーバーヘッドが原因で、マルチプロセッシングは他の2つのテクニックよりも大幅に悪化しました。これはマルチプロセッシングがここでは役に立たないという意味ではありません。まったく反対。より多くの入力辞書の結果を見てください。
for _ in range(7):
other_dicts.extend(other_dicts)
これは、辞書リストを384項目に拡張します。この入力のタイミング結果は次のとおりです。
7.934810006991029
8.184540337068029
7.466550623998046
入力ディクショナリのいずれのセットでも、マルチプロセッシング手法が最適になります。
1)それらのn辞書はどこかのリストに存在しますか? 2)複数の反復(例えば平均)の類似度スコアはどのようにして計算されますか? – SuperSaiyan
BからDまでの辞書のリストをループさせてみませんか?この問題を解決する際に特定のパフォーマンスやデータ構造の制限を満たすことを検討していますか? –
Python3の 'dict.items()'はすでに '&'と他の集合演算子で動作しています。これはリストではなく、辞書アイテムのビューである集合的なオブジェクトです。 –