をここでは、いくつかの可能な解決策です:
import timeit
import random
random.seed(1)
def f1(d1, d2):
return [(k, d1[k], d2[k]) for k in list(set(d1.keys() + d1.keys()))]
def f2(d1, d2):
return [(k, d1[k], d2[k]) for k in d1.viewkeys() & d2]
def f3(d1, d2):
return [(k, d1[k], d2[k]) for k in set().union(d1, d2)]
if __name__ == "__main__":
d1_small = {2011: 1.0,
2012: 2.0,
2013: 3.0}
d2_small = {2011: 4.0,
2012: 5.0,
2013: 6.0}
K, I, N = 1000, 100000, 100
d1_large = {i: random.randint(0, K) for i in range(I)}
d2_large = {i: random.randint(0, K) for i in range(I)}
# Small dataset
print timeit.timeit('f1(d1_small,d2_small)', setup='from __main__ import f1, d1_small,d2_small', number=N)
print timeit.timeit('f2(d1_small,d2_small)', setup='from __main__ import f2, d1_small,d2_small', number=N)
print timeit.timeit('f3(d1_small,d2_small)', setup='from __main__ import f3, d1_small,d2_small', number=N)
# Big dataset
print timeit.timeit('f1(d1_large,d2_large)', setup='from __main__ import f1, d1_large,d2_large', number=N)
print timeit.timeit('f2(d1_large,d2_large)', setup='from __main__ import f2, d1_large,d2_large', number=N)
print timeit.timeit('f3(d1_large,d2_large)', setup='from __main__ import f3, d1_large,d2_large', number=N)
結果は以下のとおりです。
0.000144082492556
0.000120792445814
9.31601869678e-05
2.70233741278
2.74489385463
2.5809042933
結論:
F3キーを超えるdict1`繰り返し処理におけるkの冗長
'の面でパフォーマンスとf2の観点から、ここでの勝者です。 '.keys'の必要はありません –