遍历字典时用与不用iter的区别

遍历字典时用与不用iter的区别

遍历字典的时候一般会用这三个方法:keys(),values(),items()
同时,它们各自都有升级版的方法:iterkeys(),itervalues(),iteritems()
区别就是加了iter,获得的数据不是列表,而是一个生成器。
好处就是占用的内存会少很多。

今天通过memory_profiler工具来检查一下,到底占用的内存会不会减少,会减少多少?
测试的demo:

import random
@profile
def random_sort2(n):

    d={i+1:i+2 for i in range(n)}
    for i in d:
        print i
        break

    for i in d.keys():
        print i
        break
    for i in d.values():
        print i
        break
    for k,v in d.items():
        print k,v
        break

    for i in d.iterkeys():
        break
    for i in d.itervalues():
        break
    for i in d.iteritems():
        break


if __name__ == "__main__":
    random_sort2(200000)

结果:

Line #    Mem usage    Increment   Line Contents
================================================
     4   12.445 MiB    0.000 MiB   @profile
     5                             def random_sort2(n):
     6                                 # l=list(range(n))
     7   38.477 MiB   26.031 MiB       d={i+1:i+2 for i in range(n)}
     8                                 # for i in d.keys():
     9                                 #     break
    10   38.477 MiB    0.000 MiB       for i in d:
    11   38.480 MiB    0.004 MiB           print i
    12   38.480 MiB    0.000 MiB           break
    13                             
    14   40.008 MiB    1.527 MiB       for i in d.keys():
    15   40.008 MiB    0.000 MiB           print i
    16   40.008 MiB    0.000 MiB           break
    17   40.008 MiB    0.000 MiB       for i in d.values():
    18   40.008 MiB    0.000 MiB           print i
    19   40.008 MiB    0.000 MiB           break
    20   49.680 MiB    9.672 MiB       for k,v in d.items():
    21   49.684 MiB    0.004 MiB           print k,v
    22   49.684 MiB    0.000 MiB           break
    23                             
    24   49.684 MiB    0.000 MiB       for i in d.iterkeys():
    25   49.684 MiB    0.000 MiB           break
    26   49.684 MiB    0.000 MiB       for i in d.itervalues():
    27   49.684 MiB    0.000 MiB           break
    28   49.684 MiB    0.000 MiB       for i in d.iteritems():
    29   49.684 MiB    0.000 MiB           break

通过keys和items都会增加内存的使用,而且keys会相对较少,items非常多。不知道为什么values不会增加内存。
直接遍历也不会增加内存(for i in d
而如果加入iter,全部遍历方式都不会增加内存的消耗。

原文地址:https://www.cnblogs.com/Xjng/p/4943567.html