<p>根据您的问题设置,似乎没有其他方法可以循环使用字典的输入列表。但是,这里可以应用多处理技巧。在</p>
<p>以下是您的意见:</p>
<pre><code>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]
</code></pre>
<p>除了我将用于循环技术的<code>similarity2</code>函数之外,我还将@gary\u fixler的映射技术作为<code>similarity1</code>包含在内。在</p>
^{pr2}$
<p>我们在这里评估3种技术:<br/>
(1) @gary\u fixler地图<br/>
(2) 简单循环查看dict列表<br/>
(3) 多处理dict列表</p>
<p>以下是执行声明:</p>
<pre><code>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))])
</code></pre>
<p>你会发现这三种方法都会产生相同的结果:</p>
<pre><code>[0.5, 0.3333333333333333, 0.16666666666666666]
[0.5, 0.3333333333333333, 0.16666666666666666]
[0.5, 0.3333333333333333, 0.16666666666666666]
</code></pre>
<p>注意,对于多处理,您有<code>multiprocessing.cpu_count()/2</code>个核心(每个核心都有超线程)。假设您的系统上没有其他运行,并且您的程序没有I/O或同步需求(就像我们的问题一样),通常使用<code>multiprocessing.cpu_count()/2-1</code>}进程,<code>-1</code>是父进程的,通常会获得最佳性能。在</p>
<p>现在,来计时3种技巧:</p>
<pre><code>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))
</code></pre>
<p>这会在我的笔记本电脑上产生以下结果:</p>
<pre><code>0.07092539698351175
0.06757041101809591
1.6528456939850003
</code></pre>
<p>您可以看到基本循环技术的性能最好。由于创建进程和来回传递数据的开销,多处理明显比其他两种技术差。这并不意味着多重处理在这里没有用处。恰恰相反。查看更多输入字典的结果:</p>
<pre><code>for _ in range(7):
other_dicts.extend(other_dicts)
</code></pre>
<p>这将字典列表扩展到384个条目。以下是此输入的计时结果:</p>
<pre><code>7.934810006991029
8.184540337068029
7.466550623998046
</code></pre>
<p>对于任何一个更大的输入字典集,多处理技术成为最佳选择。在</p>