【发布时间】:2020-09-01 17:29:43
【问题描述】:
似乎有很多与嵌套 for 循环的速度有关的问题和答案 - 我想我已经查看了其中的每一个!但不幸的是,我仍然不确定为什么我的代码很慢。我希望我能从你们这些优秀的人那里得到一些指导。
我每天下载一个包含约 116,000 个条目的 csv 文件。项目在文件中的不一致点被添加和删除,所以我每天都想看看添加了什么,删除了什么。
将条目从 csv 获取到列表完全不需要时间,对于旧列表和新列表,但我在代码的下一部分遇到了很大的速度下降,尽管最后,它做了我想要的并吐出差异 - 添加的项目和删除的项目。
列表中的 116,000 项中的每一项都是这样的字典:
old or new = [{'Date Stamped': '', 'Name': '', 'Registration Number': '', 'Type': '', "Form Name': '', 'URL': "}]
当我到达这一点时:
added = [i for i in new if not i in old]
removed = [i for i in old if not i in new]
完成需要 25 分钟!我觉得这很长一段时间,但我可能并不完全了解我在做什么。
每个列表(旧的和新的)都有大约 116000 个项目。那是因为我必须迭代约 116,000 个项目 4 次吗?
它最终完成了我想要的,但它正在做的事情似乎非常缓慢;也就是说,这真的是我第一次使用包含这么多项目的数据集,所以也许这是理所当然的。
这是因为它是嵌套的 for 循环,所以速度很慢吗?是因为尺寸慢吗?我绝对是一个业余爱好者,非常感谢大家的帮助。非常感谢。
【问题讨论】:
-
你的问题是什么?
-
在字典上使用
set? -
old or new = [{}]? -
in对于 100,000 多个项目的列表将非常慢。如果您需要进行重复的成员资格测试,您应该使用一个集合(尽管这需要可散列的对象,而 dicts 不是)。 -
这很慢,因为在
[x for x in a if x not in b]中,代码必须为每个x遍历b以检查它是否存在。如果可以的话,最好将b设为一个集合,因为查找的成本与集合的大小不成比例。最好还是让a和b设置和减去。