如何解决为什么迭代 dict 这么慢?
我已设法将其简化为一个简单的基准:
> py -m timeit -s "a = {i:i for i in range(10000000)};[a.pop(i) for i in range(10000000-1)]" "next(iter(a))"
10 loops,best of 5: 30.8 msec per loop
为什么在删除所有以前的值后迭代单个键变得很慢?
解决方法
从 3.6 开始,Python 字典使用内部哈希表和 entries 数组。
当从字典中删除一个键时,它的条目实际上在数组中被替换为 dummy value,标记该条目已删除。
在迭代时,它会一个一个地跳过所有这些虚拟值,直到找到下一个真正的项目。
这就是为什么如果你跳过第一个值,只删除其余的值,你会看到迭代与迭代单个项目字典一样快:
> py -m timeit -s "a = {i:i for i in range(10000000)};[a.pop(i) for i in range(1,10000000-1)]" "next(iter(a))"
1000000 loops,best of 5: 219 nsec per loop
有关内部字典结构的更多信息,您可以参阅this wonderful answer。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。