python2字典遍历方法性能对比
Swift Lv6

在公司服务器上跑python2程序时,使用了 tqdm(d.items()) 来包裹字典,发现进度条一直卡在0%不动,怀疑是 d.items() 取出所有的元素作为列表返回,而不是迭代器,导致耗时非常长。在此做一下性能测试,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import random
import time
from tqdm import tqdm


def construct_large_dict(length=25000000, size=3):
d = {}
for i in tqdm(range(length)):
l = []
for _ in range(size):
l.append(random.randint(0, 100))
d[i] = l
return d


if __name__ == "__main__":
d = construct_large_dict()

total = 0
start = time.time()
for key in d:
total += sum(d[key])
end1 = time.time()
print("method-1 time: {}".format(end1 - start))

total = 0
for k, v in d.items():
total += sum(v)
end2 = time.time()
print("method-2 time: {}".format(end2 - end1))

total = 0
for k, v in d.iteritems():
total += sum(v)
end3 = time.time()
print("method-3 time: {}".format(end3 - end2))

结果如下:
result

因此在遍历大字典时,推荐使用第一种或者第三种方式,进度条展示的时候也更人性化。

在python3中,已经用 d.items() 代替了 d.iteritems() ,因此无需再担心性能问题。

Powered by Hexo & Theme Keep
Unique Visitor Page View