问题描述
dict.setdefault()
和collection.defaultdict
谁更快?
官方文档表示collection.defaultdict
会更快,做个实验试一下
解决方案
随机生成1千万个数,并使用Jupyter Notebook的魔法命令%%timeit
计时
import random
from collections import defaultdict
s = []
i = 0
while i < 10000000:
i += 1
a = (random.randint(0, 9), random.randint(0, 9))
s.append(a)
dict.setdefault()
%%timeit
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
# 2.15 s ± 5.47 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
collection.defaultdict
%%timeit
d = defaultdict(list)
for k, v in s:
d[k].append(v)
# 1.25 s ± 5.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
手动添加
%%timeit
d = {}
for k, v in s:
if k not in d:
d[k] = []
d[k].append(v)
# 1.56 s ± 36.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
结论
setdefault | defaultdict | 手动添加 |
---|---|---|
2.15 s | 1.25 s | 1.56 s |
collection.defaultdict
快0.9s,约42%