<p><strong>首先,</strong>Python<code>set</code>很擅长寻找交集(它们使用散列),但是您的代码一次又一次地构造相同的<code>set</code>。E、 如果两个<code>list</code>各包含2000个元素[你的意思是外部的还是内部的<code>list</code>有那么长吗?],只有4000个不同的<code>set</code>要计算,但是您的代码要计算2000×2000×2=800万<code>set</code>s</p>
<p>所以一次计算这4000组:</p>
<pre><code>list_of_name_tuples_1 = [("a", "aa"), ("b", "bbb"), ("c", "cc", "ccc")]
list_of_name_tuples_2 = [("a", "AA"), ("b", "BBB"), ("c", "cc", "CCC")]
name_sets_1 = [set(i) for i in list_of_name_tuples_1]
name_sets_2 = [set(i) for i in list_of_name_tuples_2]
overlap = {}
for l1, s1 in zip(list_of_name_tuples_1, name_sets_1):
for l2, s2 in zip(list_of_name_tuples_2, name_sets_2):
overlap[(l1, l2)] = len(s1 & s2)
</code></pre>
<p>Python<code>list</code>是不可损坏的,因此它们不能用于<code>dict</code>键,因此我将名称列表列表更改为名称元组列表。在</p>
<p>(这段代码假设您使用的是python3,其中<code>zip()</code>返回一个迭代器。如果您使用的是python2,那么调用<code>itertools.izip()</code>在成对的元素上获得一个迭代器。)</p>
<p><strong>其次,</strong>考虑将<code>overlap</code>重组为<code>dict</code>的<code>dict</code>,而不是由元组索引的<code>dict</code>。在</p>
^{pr2}$
<p>这可以节省后续代码中的大量工作,这些代码将通过<code>overlap[l1][l2]</code>而不是<code>overlap[(l1, l2)]</code>(没有元组构造或哈希生成),嵌套循环可以在外循环中获取{<cd17>},然后在内循环中访问{<cd18>}。在</p>