为了在 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/