擅长:python、mysql、java
<p>把<code>files_downloaded</code>作为一个集合而不是一个列表。列表可能需要对列表进行一次完整的迭代,以便在每次进行检查时对其进行成员资格检查。但是集合是<a href="https://stackoverflow.com/questions/7351459/time-complexity-of-python-set-operations">much more efficient to do a lookup on</a>。你知道吗</p>
<p>只需使用:</p>
<pre><code>downloaded_set = set(files_downloaded)
list_of_files_not_dowloaded = [item for item in total_files if item not in downloaded_set]
</code></pre>
<p>这将有一个初始成本,把名单到一个集合,但成员资格检查之后将快得多。你知道吗</p>
<hr/>
<p>你知道吗@胡安帕.阿里维拉加在评论中还提到了另一个导致性能下降的原因是<code>in</code>对字符串进行了相等性检查,而在使用集合时比较哈希,后者要便宜得多。你知道吗</p>
<p>似乎,如果我读对了源代码,<a href="https://github.com/python/cpython/blob/2725cb01d7cbf5caecb51cc20d97ba324b09ce96/Objects/listobject.c#L452" rel="nofollow noreferrer">CPython's lists use a straight equality check to do comparisons when checking for membership</a>。据推测,集合使用哈希,它们在集合创建时被缓存。你知道吗</p>