web-dev-qa-db-ja.com

Python辞書の処理にはどれくらいの費用がかかりますか?

タイトルが示すように、Python辞書の処理にはどれくらいの費用がかかりますか?作成、挿入、更新、削除、すべて。

漸近的な時間計算量は、それ自体が興味深いものですが、たとえば、タプルまたは通常のリスト。

30
Deniz Dogan

dicts(各キーに値を関連付ける必要がなく、キーが存在するか存在しないかを記録するだけの場合のsetsと同様)はかなり高度に最適化されています。 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を使用すると、マイクロベンチマークを簡単に実行できます(厳密に言えば、ナノ秒が重要である非常にまれな状況でのみ保証されますが、実行するのは簡単です。他のケースをチェックするのは大きな困難です;-)。

46
Alex Martelli

辞書は、言語の多くの根底にあるため、Pythonのより高度に調整された部分の1つです。たとえば、クラスのメンバーとスタックフレーム内の変数は、どちらも辞書の内部に格納されます。それらが正しいデータ構造である場合、それらは良い選択になります。

パフォーマンスに基づいてリストとディクテーションを選択するのは奇妙に思えます。それらは異なることをします。解決しようとしている問題について詳しく教えてください。

15
Ned Batchelder