以下是一些微观基准,表明f2(见下文)可能是一种改进. f2使用iteritems,它允许你在内循环中避免额外的dict查找:
import collections
import string
import random
def random_dict():
n=random.randint(1,26)
keys=list(string.letters)
random.shuffle(keys)
keys=keys[:n]
values=[random.randint(1,100) for _ in range(n)]
return dict(zip(keys,values))
list_dictionaries=[random_dict() for x in xrange(100)]
def f1(list_dictionaries):
comb_dict = {}
for dictionary in list_dictionaries:
for key in dictionary:
comb_dict.setdefault(key, 0)
comb_dict[key] += dictionary[key]
return comb_dict
def f2(list_dictionaries):
comb_dict = collections.defaultdict(int)
for dictionary in list_dictionaries:
for key,value in dictionary.iteritems():
comb_dict[key] += value
return comb_dict
def union( dict_list ):
all_keys = set()
for d in dict_list:
for k in d:
all_keys.add( k )
for key in all_keys:
yield key, sum( d.get(key,0) for d in dict_list)
def f3(list_dictionaries):
return dict(union( list_dictionaries ))
结果如下:
% python -mtimeit -s"import test" "test.f1(test.list_dictionaries)"
1000 loops, best of 3: 776 usec per loop
% python -mtimeit -s"import test" "test.f2(test.list_dictionaries)"
1000 loops, best of 3: 432 usec per loop
% python -mtimeit -s"import test" "test.f3(test.list_dictionaries)"
100 loops, best of 3: 2.19 msec per loop