在公司服务器上跑python2程序时,使用了 tqdm(d.items())
来包裹字典,发现进度条一直卡在0%不动,怀疑是 d.items()
取出所有的元素作为列表返回,而不是迭代器,导致耗时非常长。在此做一下性能测试,代码如下:
import random
import time
from tqdm import tqdmdef 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] = lreturn dif __name__ == "__main__":d = construct_large_dict()total = 0start = time.time()for key in d:total += sum(d[key])end1 = time.time()print("method-1 time: {}".format(end1 - start))total = 0for k, v in d.items():total += sum(v)end2 = time.time()print("method-2 time: {}".format(end2 - end1))total = 0for k, v in d.iteritems():total += sum(v)end3 = time.time()print("method-3 time: {}".format(end3 - end2))
结果如下:
因此在遍历大字典时,推荐使用第一种或者第三种方式,进度条展示的时候也更人性化。
在python3中,已经用
d.items()
代替了d.iteritems()
,因此无需再担心性能问题。