国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python兩種遍歷字典(dict)的方法比較

2019-11-25 18:24:35
字體:
來源:轉載
供稿:網友

python以其優(yōu)美的語法和方便的內置數據結構,贏得了不少程序員的親睞。
其中有個很有用的數據結構,就是字典(dict),使用非常簡單。說到遍歷一個dict結構,我想大多數人都會想到 for key in dictobj 的方法,確實這個方法在大多數情況下都是適用的。但是并不是完全安全,請看下面這個例子:

復制代碼 代碼如下:

#這里初始化一個dict
>>> d = {'a':1, 'b':0, 'c':1, 'd':0}
#本意是遍歷dict,發(fā)現元素的值是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}
#結果也是對的
>>>

其實,這個例子是我簡化過的,我是在一個多線程的程序里發(fā)現這個問題的,所以,我的建議是:遍歷dict的時候,養(yǎng)成使用 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條以上的數據后不帶括號的執(zhí)行時間會少些.

下面是測試代碼:

復制代碼 代碼如下:

測試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()

中文亂碼問題有沒有很好的解決辦法....?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 孟州市| 教育| 横峰县| 洱源县| 嘉祥县| 富顺县| 集安市| 和田县| 五峰| 常山县| 邵东县| 乌鲁木齐县| 稻城县| 南和县| 东港市| 克什克腾旗| 泾源县| 府谷县| 安溪县| 墨脱县| 梓潼县| 子洲县| 光山县| 泸州市| 兴海县| 康保县| 法库县| 临朐县| 阜阳市| 乃东县| 格尔木市| 泽州县| 阿克苏市| 元氏县| 香河县| 壤塘县| 北碚区| 永清县| 太仆寺旗| 玉环县| 大田县|