<p>问题不在于你的算法,而是你的数据结构。在</p>
<p>如果我理解您的问题,您必须迭代所有<code>j, k</code>组合;根本没有办法绕过它。所以最好的算法可能是<code>dic</code>长度的二次型。在</p>
<p>但是,对于每一对,您都在重复地执行一系列线性搜索,<code>dic[j][2][r] in dic[k][2]</code>。那部分是不必要的。如果您只需将这些<code>dic[*][2]</code>列表中的每一个都更改为集合,那么相同的查找就会变得即时。在</p>
<p>因此,代替<code>O(N^2 * M^2)</code>,其中<code>N</code>是<code>dic</code>的长度,<code>M</code>是(平均值?)<code>dic[*][2]</code>的长度是<code>O(N^2 * M)</code>。仍然很慢,但快得多。在</p>
<p>您没有向我们展示您在哪里构建这个巨大的列表,所以我不能向您展示如何以不同的方式构建它……但是通常这只是一个从<code>set()</code>开始并调用<code>.add</code>而不是从<code>[]</code>开始并调用<code>.append</code>。在</p>
<p>或者,如果你不能改变它的建造方式,你可以在事后改变它:</p>
<pre><code>dic = [[a, b, set(c)] for a, b, c in dic]
</code></pre>
<hr/>
<p>我假设你没有重复计算两次。如果你不想重复的话。但是无论如何,您可以通过使用“multiset”类型来解决这个问题;通常<code>collections.Counter</code>是实现此目的的最简单方法。在</p>
<hr/>
<p>通过使用集合交集而不是迭代一个集合来检查另一个集合,也可以使它更简单(尽管速度稍快)。而不是这样:</p>
^{pr2}$
<p>…这样做:</p>
<pre><code>temp_score += len(dic[j][2] & dic[k][2])
</code></pre>
<hr/>
<p>当我们在做的时候,你可以使用<code>for x in dic</code>和<code>x</code>来代替<code>for j in range(len(dic))</code>然后到处使用<code>dic[j]</code>。像这样:</p>
<pre><code>for x in dic:
for y in dic:
score_temp = len(x[2] & y[2])
score_final = float(score_temp) / (x[1] + y[1])
dice_cursor.execute('insert into dices values(?,?,?)',
(x[0], y[0], score_final))
</code></pre>
<p>或者,更简洁地说:</p>
<pre><code>for x, y in itertools.product(dic, dic):
</code></pre>