ブラケットは のラッパーに過ぎないというのが私の理解でした__getitem__
。これをベンチマークした方法は次のとおりです。
まず、準大規模辞書を生成しました。
items = {}
for i in range(1000000):
items[i] = 1
次に、cProfile を使用して次の 3 つの関数をテストしました。
def get2(items):
for k in items.iterkeys():
items.get(k)
def magic3(items):
for k in items.iterkeys():
items.__getitem__(k)
def brackets1(items):
for k in items.iterkeys():
items[k]
結果は次のようになりました。
1000004 function calls in 3.779 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.779 3.779 <string>:1(<module>)
1 2.135 2.135 3.778 3.778 dict_get_items.py:15(get2)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1000000 1.644 0.000 1.644 0.000 {method 'get' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {method 'iterkeys' of 'dict' objects}
1000004 function calls in 3.679 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.679 3.679 <string>:1(<module>)
1 2.083 2.083 3.679 3.679 dict_get_items.py:19(magic3)
1000000 1.596 0.000 1.596 0.000 {method '__getitem__' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {method 'iterkeys' of 'dict' objects}
4 function calls in 0.136 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.136 0.136 <string>:1(<module>)
1 0.136 0.136 0.136 0.136 dict_get_items.py:11(brackets1)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {method 'iterkeys' of 'dict' objects}
問題はベンチマークの方法にありますか? データが実際にアクセスされていることを確認するために、ブラケットアクセスを単純な「パス」に置き換えてみたところ、「パス」の方がはるかに高速に実行されていることがわかりました。これについての私の解釈は、データが実際にアクセスされていたというものでした。また、新しいリストに追加しようとしましたが、同様の結果が得られました。