同様のデータを含む辞書がいくつかあります。
ほとんどのクエリは、1 つの辞書を 1 回検索するだけで解決されます。
dict にキーが存在するかどうかの事前チェックを省き、except 節でキー エラーをキャッチする次の dict を試した方が、パフォーマンスが向上しますか?
または多分何か
# d1, d2, d3 = bunch of dictionaries
value = d1.get(key, d2.get(key, d3.get(key, 0)))
?
同様のデータを含む辞書がいくつかあります。
ほとんどのクエリは、1 つの辞書を 1 回検索するだけで解決されます。
dict にキーが存在するかどうかの事前チェックを省き、except 節でキー エラーをキャッチする次の dict を試した方が、パフォーマンスが向上しますか?
または多分何か
# d1, d2, d3 = bunch of dictionaries
value = d1.get(key, d2.get(key, d3.get(key, 0)))
?
ほとんどの場合、使用しget
た方が速いようです。これが私のテスト実行try..except
で、 get を使用しています
>>> def foo1(n):
spam = dict(zip(range(-99,100,n),[1]*200))
s = 0
for e in range(1,100):
try:
s += spam[e]
except KeyError:
try:
s += spam[-e]
except KeyError:
s += 0
return s
>>> def foo2(n):
spam = dict(zip(range(-99,100,n),[1]*200))
s = 0
for e in range(1,100):
s += spam.get(e, spam.get(-e,0))
return s
>>> for i in range(1,201,10):
res1 = timeit.timeit('foo1({})'.format(i), setup = "from __main__ import foo1", number=1000)
res2 = timeit.timeit('foo2({})'.format(i), setup = "from __main__ import foo2", number=1000)
print "{:^5}{:10.5}{:10.5}{:^10}{:^10}".format(i,res1,res2,foo1(i),foo2(i))
1 0.075102 0.082862 99 99
11 0.25096 0.054272 9 9
21 0.2885 0.051398 10 10
31 0.26211 0.060171 7 7
41 0.26653 0.053595 5 5
51 0.2609 0.052511 4 4
61 0.2686 0.052792 4 4
71 0.26645 0.049901 3 3
81 0.26351 0.051275 3 3
91 0.26939 0.051192 3 3
101 0.264 0.049924 2 2
111 0.2648 0.049875 2 2
121 0.26644 0.049151 2 2
131 0.26417 0.048806 2 2
141 0.26418 0.050543 2 2
151 0.26585 0.049787 2 2
161 0.26663 0.051136 2 2
171 0.26549 0.048601 2 2
181 0.26425 0.050964 2 2
191 0.2648 0.048734 2 2
>>>
try...except
通常、使用するよりも時間がかかりますget
が、いくつかのことに依存します...
timeit モジュールを使用して、特定の状況でのパフォーマンスを次のようにテストしてみてください。
def do_stuff():
blah
timeit.timeit('testfunc()', 'from __main__ import do_stuff as testfunc')