21

コンパイルで最適化できるため、C++ の方が if else よりも高速であることについて話しているリンクがいくつか見つかりました。その後、辞書を使用した方が If ステートメントよりも高速である可能性があるという提案がいくつか見つかりました。ただし、会話のほとんどは、誰かの仕事に関するもので、コードの他の部分を最初に最適化する必要があるという議論に終わります。これがなぜなのか説明できる人はいますか?

Pythonコードに常にストリーミングされる100個の一意の番号があるとします。それが何番かを調べて、何かを実行したい。したがって、大量の if else を実行するか、各数値を辞書に入れることができます。議論のために、単一のスレッドとしましょう。

Pythonとこれがどのように機能しているかを説明できる低レベルの実行の間のレイヤーを誰かが理解していますか?

ありがとう :)

4

2 に答える 2

8

if/elif/else 構造は、与えられたキーを可能な値のシーケンスと 1 つずつ比較し、if ステートメントの条件に一致するものを見つけてから、if ブロック内から実行することになっているものを読み取ります。ルックアップごとに非常に多くのチェック (可能な値n/2について平均して) を行う必要があるため、これには長い時間がかかる可能性があります。n

if ステートメントのシーケンスを最適化するのが switch ステートメントよりも難しい理由は、条件チェック (C++ では括弧内にあるもの) によって、次のチェックに関与する変数の状態が変更される可能性があるためです。それらを順番に。switch ステートメントの制限により、その可能性が排除されるため、順序は関係ありません (と思います)。


Python 辞書は、ハッシュ テーブルとして実装されます。アイデアは次のとおりです。任意に大きな数を処理でき、無限の RAM がある場合、ルックアップ値を整数にキャストし、それをインデックスとして使用するだけで、インデックス付きの関数ポインターの巨大な配列を作成できます。ルックアップは事実上瞬時に行われます。

もちろん、それを行うことはできませんが、扱いやすい長さの配列を作成し、ルックアップ値をハッシュ関数(ルックアップ値に応じて整数を生成します)に渡すことはでき%ます。配列を使用して、その配列の境界内のインデックスを取得します。そうすれば、ルックアップには、ハッシュ関数を 1 回呼び出し、モジュラスを取得し、インデックスにジャンプするのに必要なだけの時間がかかります。可能性のあるさまざまなルックアップ値の量が十分に大きい場合、ハッシュ関数のオーバーヘッドは、これらのn/2条件チェックと比較して無視できます。

(実際には、多くの異なるルックアップ値が必然的に同じインデックスにマップされるため、それほど単純ではありません。可能性のある競合を確認して解決する必要がありますが、これはさまざまな方法で実行できます。それでも、その要点は次のとおりです。前述。)

于 2013-04-10T11:14:35.050 に答える