代码之家  ›  专栏  ›  技术社区  ›  Bharel

为什么对dict的迭代如此之慢?

  •  3
  • Bharel  · 技术社区  · 4 年前

    我有一个脚本,它做了大量的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
    

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

    1 回复  |  直到 4 年前
        1
  •  9
  •   Bharel    4 年前

    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 .