python - python中列表的减法,优化速度

标签 python list subtraction

为了在 python 中找出两个列表的替换,我使用:

names_of_files_not_dowloaded = [item for item in total_files if item not in names_of_files_downloaded]

它有效。

列表的大小是:

文件总数56373个元素

下载的文件列表 28464 个元素

它持续 34 秒。 不知何故,我的直觉是 34 秒太长了。 有什么方法可以更有效地进行减法?

谢谢

编辑: 元素类似于“AB12345”

列表没有任何重复的元素,它们已经是集合了

最佳答案

只需将 files_downloaded 设为集合而不是列表即可。列表可能需要列表的完整迭代来进行成员资格检查,每次您想进行检查。然而,集合是 much more efficient to do a lookup on .

只需使用:

downloaded_set = set(files_downloaded)
list_of_files_not_dowloaded = [item for item in total_files if item not in downloaded_set]

将列表放入集合会产生初始成本,但之后的成员资格检查会快得多。


@juanpa.arrivillaga 在评论中还提到,造成性能下降的另一个原因是 in 对字符串进行相等性检查,而在使用 Sets 时会比较哈希值,而后者要便宜得多.

看起来,如果我正确阅读源代码,CPython's lists use a straight equality check to do comparisons when checking for membership .据推测,Sets 使用哈希,并且它们在 Set 创建时被缓存。

关于python - python中列表的减法,优化速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247185/

相关文章:

java - Java中字符串数字的加法和减法

excel - 在 Excel 中添加和减去时间码

python - 无法通过 pip 安装任何包

python - 在 Python 中将字符串转换为所有非字母数字字符的列表

java - 如何在分布式系统中以相同的方式随机化两个字符串集合?

java - 从 Java 转换为 Python

Java 故障?减数?

Python pyvttbl方差分析错误

python - Jsonpickle 编码 float ,许多小数为空

javascript - 在django中显示 "still loading"