タイトルが示すように、Python辞書の処理にはどれくらいの費用がかかりますか?作成、挿入、更新、削除、すべて。
漸近的な時間計算量は、それ自体が興味深いものですが、たとえば、タプルまたは通常のリスト。
dicts
(各キーに値を関連付ける必要がなく、キーが存在するか存在しないかを記録するだけの場合のset
sと同様)はかなり高度に最適化されています。 N個のキーまたはキーと値のペアからdict
を作成するのはO(N)
、フェッチするのはO(1)
、パッティングは償却するO(1)
などです。小さなコンテナ以外では、実質的にこれ以上のことはできません。
小さなコンテナの場合、timeit
ベースのベンチマークで境界を簡単に確認できます。例えば:
$ python -mtimeit -s'empty=()' '23 in empty'
10000000 loops, best of 3: 0.0709 usec per loop
$ python -mtimeit -s'empty=set()' '23 in empty'
10000000 loops, best of 3: 0.101 usec per loop
$ python -mtimeit -s'empty=[]' '23 in empty'
10000000 loops, best of 3: 0.0716 usec per loop
$ python -mtimeit -s'empty=dict()' '23 in empty'
10000000 loops, best of 3: 0.0926 usec per loop
これは、空のリストまたはタプルのメンバーシップをチェックする方が、空のセットまたはdictのメンバーシップをチェックするよりも、なんと20〜30ナノ秒速いことを示しています。ナノ秒ごとに重要な場合、この情報はあなたに関連している可能性があります。少し上に移動...:
$ python -mtimeit -s'empty=range(7)' '23 in empty'
1000000 loops, best of 3: 0.318 usec per loop
$ python -mtimeit -s'empty=Tuple(range(7))' '23 in empty'
1000000 loops, best of 3: 0.311 usec per loop
$ python -mtimeit -s'empty=set(range(7))' '23 in empty'
10000000 loops, best of 3: 0.109 usec per loop
$ python -mtimeit -s'empty=dict.fromkeys(range(7))' '23 in empty'
10000000 loops, best of 3: 0.0933 usec per loop
7アイテムのコンテナ(対象のコンテナを含まない)の場合、パフォーマンスのバランスが変化し、ディクテーションとセットに数百ナノ秒の利点があることがわかります。関心のあるアイテムが存在する場合IS存在する:
$ python -mtimeit -s'empty=range(7)' '5 in empty'
1000000 loops, best of 3: 0.246 usec per loop
$ python -mtimeit -s'empty=Tuple(range(7))' '5 in empty'
1000000 loops, best of 3: 0.25 usec per loop
$ python -mtimeit -s'empty=dict.fromkeys(range(7))' '5 in empty'
10000000 loops, best of 3: 0.0921 usec per loop
$ python -mtimeit -s'empty=set(range(7))' '5 in empty'
10000000 loops, best of 3: 0.112 usec per loop
dictとsetはあまり得られませんが、dictとsetは非常に高速なままですが、タプルとリストは得られます。
などなど--timeit
を使用すると、マイクロベンチマークを簡単に実行できます(厳密に言えば、ナノ秒が重要である非常にまれな状況でのみ保証されますが、実行するのは簡単です。他のケースをチェックするのは大きな困難です;-)。
辞書は、言語の多くの根底にあるため、Pythonのより高度に調整された部分の1つです。たとえば、クラスのメンバーとスタックフレーム内の変数は、どちらも辞書の内部に格納されます。それらが正しいデータ構造である場合、それらは良い選択になります。
パフォーマンスに基づいてリストとディクテーションを選択するのは奇妙に思えます。それらは異なることをします。解決しようとしている問題について詳しく教えてください。