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解析xml文件实例分享
Dec 04 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
python 实现超级玛丽游戏
Nov 25 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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 什么是PEAR?
2009/03/19 PHP
php中几种常见安全设置详解
2010/04/06 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python os模块简单应用示例
2019/05/23 Python
python print出共轭复数的方法详解
2019/06/25 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
《巨人的花园》教学反思
2014/02/12 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
校庆活动方案
2014/03/31 职场文书
五四演讲稿范文
2014/09/03 职场文书
超市收银员岗位职责
2015/04/07 职场文书
2019秋季运动会口号
2019/06/25 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python