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

遍历字典时用与不用iter的区别的更多相关文章

  1. Lua中,泛型for循环遍历table时,ipairs和pairs的区别

    为了看出两者的区别,首先定义一个table: a={"Hello","World";a=1,b=2,z=3,x=10,y=20;"Good" ...

  2. Django模板遍历字典的方法

    使用Python + Django做Web开发时,有时需要在view中传递一个字典给模板(template),如何在模板中遍历字典呢? 下面介绍两种方法: views.py代码如下: dicts = ...

  3. sh_21_遍历字典的列表

    sh_21_遍历字典的列表 students = [ {"name": "阿土"}, {"name": "小美"} ] ...

  4. 遍历ArrayList时同时修改引发的问题

    看见一篇博客,没有写完整,于是增补了一下: 博客原文:http://www.cnblogs.com/alipayhutu/archive/2012/08/11/2634073.html 注:黄色字体为 ...

  5. C#遍历字典

    C#遍历字典 foreach (KeyValuePair<int, Color> kvp in dic) lst.Add(kvp.Value);

  6. php 中遍历数组时使用引用出现的问题

    今天在使用foreach遍历数组时发现,当使用&时会出现问题: $arr = array( array('id' => 100, 'error'=> 'aa'), array('i ...

  7. swift基本用法-for循环遍历,遍历字典,循环生成数组

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

  8. python遍历字典元素

    a={'a':{'b':{'c':{'d':'e'}},'f':'g'},'h':'i'} def show(myMap): for str in myMap.keys(): secondDict=m ...

  9. 2018-08-03 中文代码示例之Python-如何遍历字典

    此系列之后将参考一些最常用功能的在线教程/示例程序, 进行示例代码的中文化改进. 欢迎推荐有代表性和实用性的教程, 篇幅小更佳. 谢谢. 参考Python - How to loop a dictio ...

随机推荐

  1. iOS搜索框

    在iOS8以前搜索框是作为一个控件添加到TableViewController中, 有系统自带的搜索变量self.searchDisplayController 遵守一个搜索显示的协议<UISe ...

  2. linux-阿里云ECS部署PPTP(centos)

    请参考以下步骤:(centos6.5中测试通过) 1.服务器端安装软件 1.1 首先安装ppp,命令: [root@test ~]#yum install -y ppp 提示Complete! ,表示 ...

  3. wpf 父控件透明子控件不透明

    在wpf开发中遇到子控件会继承父类控件属性的问题, 例如: <StackPanel Orientation="Horizontal" Grid.Row="1&quo ...

  4. Jsonp post 跨域方案

    近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下. 说明:http://ww ...

  5. VIJOS P1540 月亮之眼

    [题目大意] 有多个珠子,给出部分珠子之间的相对上下位置和间距,问你这些珠子在满足给出的条件下,是否能把珠子排列在一条竖直直线上,如果能,求出每个珠子距离最高的珠子的距离,珠子的位置可重叠. [分析] ...

  6. [改善Java代码]避免对象的浅拷贝

    建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力.拷贝是在内存中进行的,所以在性能方面比直接通过ne ...

  7. linux进程间通信概述

    一个大型的应用系统,往往需要众多进程协作,进程间通信的重要性显而易见. 进程间通信有如下一些目的: 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间. 共享数据: ...

  8. Commons Configuration2 - Quick start guide

    原文:http://commons.apache.org/proper/commons-configuration/userguide/quick_start.html Reading a prope ...

  9. 在 Tomcat 中设置 JDBCRealm

    除了默认配置的 DataSourceRealm,Tomcat 还支持 JDBCRealm,它通过 JDBC 来访问记录在关系数据库里的认证信息. JDBCRealm 的配置步骤如下: 在 $TOMCA ...

  10. Lombok 安装

    Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lombok ,开发人 ...