使用更新应该非常有效:
my_dict = {}
for d in dict_list:
my_dict.update(d)
您输入的一些时间安排:
In [13]: %%timeit
my_dict = {}
for d in dict_list:
my_dict.update(d)
....:
1000000 loops, best of 3: 557 ns per loop
In [14]: timeit {key: item[key] for item in dict_list for key in item}
1000000 loops, best of 3: 597 ns per loop
In [15]: %%timeit
my_dict = {}
for i in dict_list:
for k,v in i.iteritems():
my_dict[k] = v
....:
1000000 loops, best of 3: 664 ns per loop
In [16]: %%timeit
my_dict = {}
for d in dict_list:
for k in d:
my_dict[k] = d[k]
....:
1000000 loops, best of 3: 626 ns per loop
In [17]: timeit dict(reduce(operator.add, [dic.items() for dic in dict_list]))
1000000 loops, best of 3: 1.55 µs per loop
需要注意的一点是,如果您有重复的键,那么您最终将覆盖该值,每次都会以您遇到的特定键的最后一个值结束。
使用包含唯一键的 800000 个字典列表再次运行测试,它显示字典理解是最快的:
In [81]: dict_list = [{i:[1,2,3]} for i in xrange(800000)]
In [82]: timeit {key: item[key] for item in dict_list for key in item}
10 loops, best of 3: 165 ms per loop
In [83]: %%timeit
my_dict = {}
for d in dict_list:
my_dict.update(d)
....:
1 loops, best of 3: 215 ms per loop
In [84]: %%timeit
my_dict = {}
for d in dict_list:
for k in d:
my_dict[k] = d[k]
....:
10 loops, best of 3: 198 ms per loop
In [85]: %%timeit
my_dict = {}
for i in dict_list:
for k,v in i.iteritems():
my_dict[k] = v
....:
1 loops, best of 3: 226 ms per loop
只是为了验证两者产生相同的输出:
In [79]: my_dict = {}
for d in dict_list:
my_dict.update(d)
....:
In [115]: len(my_dict)
Out[115]: 2400000
In [80]: my_dict == {key: item[key] for item in dict_list for key in item}
Out[80]: True
最终每个字典使用三个键,更新再次获胜:
In [108]: dict_list = [{i:[1000,2000,3000],i+800000:[1000,2000,3000],i+1700000:[1000,2000,3000]} for i in xrange(800000)]
In [109]: %%timeit
my_dict = {}
for i in dict_list:
for k,v in i.iteritems():
my_dict[k] = v
.....:
1 loops, best of 3: 468 ms per loop
In [110]: %%timeit
my_dict = {}
for d in dict_list:
for k in d:
my_dict[k] = d[k]
.....:
1 loops, best of 3: 476 ms per loop
In [111]: timeit {key: item[key] for item in dict_list for key in item}
1 loops, best of 3: 448 ms per loop
In [112]: %%timeit
my_dict = {}
for d in dict_list:
my_dict.update(d)
.....:
1 loops, best of 3: 328 ms per loop
所以似乎有更多的键有助于抵消调用更新的成本,所以如果你的输入只有一个键,那么 dict comp 应该更快,如果你有多个键,那么 update 应该是。