python两种遍历字典(dict)的方法比较


Posted in Python onMay 29, 2014

python以其优美的语法和方便的内置数据结构,赢得了不少程序员的亲睐。
其中有个很有用的数据结构,就是字典(dict),使用非常简单。说到遍历一个dict结构,我想大多数人都会想到 for key in dictobj 的方法,确实这个方法在大多数情况下都是适用的。但是并不是完全安全,请看下面这个例子:

#这里初始化一个dict
>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#本意是遍历dict,发现元素的值是0的话,就删掉
>>> for k in d:
...   if d[k] == 0:
...     del(d[k])
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
#结果抛出异常了,两个0的元素,也只删掉一个。
>>> d
{'a': 1, 'c': 1, 'd': 0}>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#d.keys() 是一个下标的数组
>>> d.keys()
['a', 'c', 'b', 'd']
#这样遍历,就没问题了,因为其实其实这里遍历的是d.keys()这个list常量。
>>> for k in d.keys():
...   if d[k] == 0:
...     del(d[k])
... 
>>> d
{'a': 1, 'c': 1}
#结果也是对的
>>>

其实,这个例子是我简化过的,我是在一个多线程的程序里发现这个问题的,所以,我的建议是:遍历dict的时候,养成使用 for k in d.keys() 的习惯。
不过,如果是多线程的话,这样就绝对安全吗?也不见得:当两个线程都取完d.keys()以后,如果两个线程都去删同一个key的话,先删的会成功,后删的那个肯定会报 KeyError ,这个看来只能通过其他方式来保证了。

另一篇:dict 两种遍历方式的性能对比

关于纠结dict遍历中带括号与不带括号的性能问题

for (d,x) in dict.items():
     print "key:"+d+",value:"+str(x)for d,x in dict.items():
    print "key:"+d+",value:"+str(x)

带括号和不带括号性能测试结果:

测试结果
测试条数:15
带括号开始时间:2012-06-14 12:13:37.375000
带括号结束时间:2012-06-14 12:13:37.375000
时间间隔:0:00:00
不带括号开始时间:2012-06-14 12:13:37.375000
不带括号结束时间:2012-06-14 12:13:37.375000
时间间隔:0:00:00
测试条数:50
带括号开始时间:2012-06-14 12:13:57.921000
带括号结束时间:2012-06-14 12:13:57.921000
时间间隔:0:00:00
不带括号开始时间:2012-06-14 12:13:57.921000
不带括号结束时间:2012-06-14 12:13:57.937000
时间间隔:0:00:00.016000
测试条数:100
带括号开始时间:2012-06-14 11:53:57.453000
带括号结束时间:2012-06-14 11:53:57.468000
时间间隔:0:00:00.015000
不带括号开始时间:2012-06-14 11:53:57.468000
不带括号结束时间:2012-06-14 11:53:57.531000
时间间隔:0:00:00.063000
测试条数:150
带括号开始时间:2012-06-14 12:00:54.812000
带括号结束时间:2012-06-14 12:00:54.828000
时间间隔:0:00:00.016000
不带括号开始时间:2012-06-14 12:00:54.828000
不带括号结束时间:2012-06-14 12:00:54.921000
时间间隔:0:00:00.093000
测试条数:200
带括号开始时间:2012-06-14 11:59:54.609000
带括号结束时间:2012-06-14 11:59:54.687000
时间间隔:0:00:00.078000
不带括号开始时间:2012-06-14 11:59:54.687000
不带括号结束时间:2012-06-14 11:59:54.734000
时间间隔:0:00:00.047000
测试条数:500
带括号开始时间:2012-06-14 11:54:39.906000
带括号结束时间:2012-06-14 11:54:40.078000
时间间隔:0:00:00.172000
不带括号开始时间:2012-06-14 11:54:40.078000
不带括号结束时间:2012-06-14 11:54:40.125000
时间间隔:0:00:00.047000
测试条数:1000
带括号开始时间:2012-06-14 11:54:49.171000
带括号结束时间:2012-06-14 11:54:49.437000
时间间隔:0:00:00.266000
不带括号开始时间:2012-06-14 11:54:49.437000
不带括号结束时间:2012-06-14 11:54:49.609000
时间间隔:0:00:00.172000
测试条数:2000
带括号开始时间:2012-06-14 11:54:58.921000
带括号结束时间:2012-06-14 11:54:59.328000
时间间隔:0:00:00.407000
不带括号开始时间:2012-06-14 11:54:59.328000
不带括号结束时间:2012-06-14 11:54:59.687000
时间间隔:0:00:00.359000
测试条数:5000
带括号开始时间:2012-06-14 11:55:05.781000
带括号结束时间:2012-06-14 11:55:06.734000
时间间隔:0:00:00.953000
不带括号开始时间:2012-06-14 11:55:06.734000
不带括号结束时间:2012-06-14 11:55:07.609000
时间间隔:0:00:00.875000
测试条数:10000
带括号开始时间:2012-06-14 11:55:15.656000
带括号结束时间:2012-06-14 11:55:17.390000
时间间隔:0:00:01.734000
不带括号开始时间:2012-06-14 11:55:17.390000
不带括号结束时间:2012-06-14 11:55:19.109000
时间间隔:0:00:01.719000
测试条数:20000
带括号开始时间:2012-06-14 12:19:14.921000
带括号结束时间:2012-06-14 12:19:18.593000
时间间隔:0:00:03.672000
不带括号开始时间:2012-06-14 12:19:18.593000
不带括号结束时间:2012-06-14 12:19:22.218000
时间间隔:0:00:03.625000

我们可以看出,dict条数在200一下的时候是带括号的性能比较高一点,但是在200条以上的数据后不带括号的执行时间会少些.

下面是测试代码:

测试Code
#-*- coding: utf-8 -*-
import datetime,codecs
dict = {}
for i in xrange(0,20000):
    dict.setdefault("name"+str(i))
    dict["name"+str(i)]="name"
s=codecs.open(r'c:\\dict.txt','a', 'utf-8')
def write(des):
    s.write(des.decode("utf-8"))
write("测试条数:")
write(str(len(dict))+"\r\n")
write("带括号开始时间:")
a=datetime.datetime.now()
s.write(str(a)+"\r\n")
for (d,x) in dict.items():
    print "key:"+d+",value:"+str(x)
write("带括号结束时间:")
b=datetime.datetime.now()
write(str(b)+"\r\n")
write("时间间隔:")
write(str(b-a)+"\r\n")
write("不带括号开始时间:")
c=datetime.datetime.now()
write(str(c)+"\r\n")
for d,x in dict.items():
    print "key:"+d+",value:"+str(x)
write("不带括号结束时间:")
d=datetime.datetime.now()
write(str(d)+"\r\n")
write("时间间隔:")
write(str(d-c)+"\r\n")
write("\r\n")
s.close()

中文乱码问题有没有很好的解决办法....?

Python 相关文章推荐
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python中self原理实例分析
Apr 30 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
python九九乘法表的实例
Sep 26 Python
《与孩子一起学编程》python自测题
May 27 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
Python读取指定日期邮件的实例
Feb 01 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 Python
Python内置数据类型中的集合详解
Mar 18 Python
python中常用的各种数据库操作模块和连接实例
May 29 #Python
从零学Python之入门(五)缩进和选择
May 27 #Python
从零学Python之入门(四)运算
May 27 #Python
一则python3的简单爬虫代码
May 26 #Python
从零学Python之入门(三)序列
May 25 #Python
从零学Python之入门(二)基本数据类型
May 25 #Python
Python tempfile模块学习笔记(临时文件)
May 25 #Python
You might like
php统计时间和内存使用情况示例分享
2014/03/13 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
jQuery 表单验证扩展(四)
2010/10/20 Javascript
javascript定义函数的方法
2010/12/06 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
Python for循环与range函数的使用详解
2019/03/23 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
开学季活动策划方案
2014/02/28 职场文书
研究生导师评语
2014/12/31 职场文书
入党积极分子考察意见
2015/06/02 职场文书
周一给客户的问候语
2015/11/10 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
zabbix配置nginx监控的实现
2022/05/25 Servers