• 遍历字典时用与不用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,全部遍历方式都不会增加内存的消耗。

  • 相关阅读:
    Hadoop 回收站
    Sparkstreaming reduceByKeyAndWindow(_+_, _-_, Duration, Duration) 的源码/原理解析
    spark streaming updateStateByKey 用法
    spark streaming 直连 kafka 分区
    sparkStreaming 练习
    json demo
    spark与flume整合
    spark sql 入门
    【面试】c++单例模式
    Python高级笔记(十一)装饰器【面试】
  • 原文地址:https://www.cnblogs.com/Xjng/p/4943567.html
Copyright © 2020-2023  润新知