根據您的問題設置,看起來沒有其他選擇循環輸入詞典列表。但是,這裏可以應用多處理技巧。
這是你輸入:
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]
我已經包含@ gary_fixler的地圖技術爲similarity1
,此外,我將使用循環技術的similarity2
功能。
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種技術,在這裏:
(1)@ gary_fixler的地圖
(2)通過http://stardict.sourceforge.net/Dictionaries.php下載列表中簡單的循環
(3)多處理器類型的字典
以下是名單執行語句:
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
你可以看到,基本的循環技術來執行最好的。由於創建進程和來回傳遞數據的開銷,多處理比其他兩種技術明顯更差。這並不意味着多處理在這裏沒有用處。恰恰相反。查看大量輸入字典的結果:
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()'已經可以和'&'和其他集合運算符一起工作。它不是一個列表,而是一個類似對象的字典項目視圖。 –