【问题标题】:Why is iterating over a dict so slow?为什么迭代 dict 这么慢?
【发布时间】:2021-04-29 21:47:00
【问题描述】:

我有一个脚本可以删除大量字典并最终对其进行迭代。

我已设法将其简化为一个简单的基准:

> 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

为什么在我删除所有以前的值之后迭代单个键变得很慢?

【问题讨论】:

    标签: python performance dictionary iteration python-internals


    【解决方案1】:

    从 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

    【讨论】:

    • 你每天都会学到新东西。知道这一点非常有用!
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2018-01-20
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多