if/elif/else 構造は、与えられたキーを可能な値のシーケンスと 1 つずつ比較し、if ステートメントの条件に一致するものを見つけてから、if ブロック内から実行することになっているものを読み取ります。ルックアップごとに非常に多くのチェック (可能な値n/2
について平均して) を行う必要があるため、これには長い時間がかかる可能性があります。n
if ステートメントのシーケンスを最適化するのが switch ステートメントよりも難しい理由は、条件チェック (C++ では括弧内にあるもの) によって、次のチェックに関与する変数の状態が変更される可能性があるためです。それらを順番に。switch ステートメントの制限により、その可能性が排除されるため、順序は関係ありません (と思います)。
Python 辞書は、ハッシュ テーブルとして実装されます。アイデアは次のとおりです。任意に大きな数を処理でき、無限の RAM がある場合、ルックアップ値を整数にキャストし、それをインデックスとして使用するだけで、インデックス付きの関数ポインターの巨大な配列を作成できます。ルックアップは事実上瞬時に行われます。
もちろん、それを行うことはできませんが、扱いやすい長さの配列を作成し、ルックアップ値をハッシュ関数(ルックアップ値に応じて整数を生成します)に渡すことはでき%
ます。配列を使用して、その配列の境界内のインデックスを取得します。そうすれば、ルックアップには、ハッシュ関数を 1 回呼び出し、モジュラスを取得し、インデックスにジャンプするのに必要なだけの時間がかかります。可能性のあるさまざまなルックアップ値の量が十分に大きい場合、ハッシュ関数のオーバーヘッドは、これらのn/2
条件チェックと比較して無視できます。
(実際には、多くの異なるルックアップ値が必然的に同じインデックスにマップされるため、それほど単純ではありません。可能性のある競合を確認して解決する必要がありますが、これはさまざまな方法で実行できます。それでも、その要点は次のとおりです。前述。)