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

  • 相关阅读:
    JAVA NIO 结合多线程
    ios即时通讯客户端开发之-mac上安装MySQL
    使用第三方库AFNetworking时遇到的问题
    用CocoaPods做iOS程序的依赖管理(转载)
    IOS8 设置TableView Separatorinset 分割线从边框顶端开始
    (转)UIViewController中各方法调用顺序及功能详解
    iOS中遍历数组的几种方法
    取消tableView上面多出来20个像素
    UIView动画中的一些坑
    ios build时,Undefined symbols for architecture xxx问题的总结(转)
  • 原文地址:https://www.cnblogs.com/Xjng/p/4943567.html
Copyright © 2011-2022 走看看