1. ホーム
  2. python

[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?

2022-03-18 16:16:58

質問

def main():
    for i in xrange(10**8):
        pass
main()

でPythonのこのコード片が実行されます(注:タイミングはLinuxのBASHのtime関数で行っています)。

real    0m1.841s
user    0m1.828s
sys     0m0.012s

しかし、forループが関数内に配置されていない場合。

for i in xrange(10**8):
    pass

とすると、もっと長い時間実行されます。

real    0m4.543s
user    0m4.524s
sys     0m0.012s

これはなぜでしょうか?

解決方法は?

という質問を受けることがあります。 なぜ は、グローバル変数よりもローカル変数を格納する方が高速です。これはCPythonの実装の詳細です。

CPythonはバイトコードにコンパイルされ、インタープリタがそれを実行することを覚えておいてください。関数がコンパイルされるとき、ローカル変数は固定サイズの配列( ではなく a dict ) と変数名がインデックスに割り当てられています。これは、関数に動的にローカル変数を追加することができないから可能なのです。そうすると、ローカル変数を取り出すには、文字通りリストへのポインタ参照と PyObject というのは些細なことです。

これと対照的に、グローバルルックアップ ( LOAD_GLOBAL ) であり、これは真の dict ハッシュなどを含む検索を行います。ちなみに、このために global i グローバルにしたい場合:スコープ内の変数に代入すると、コンパイラは STORE_FAST を使用しないよう指示しない限り、そのアクセスに対して

ちなみに、グローバルルックアップは今でもかなり最適化されています。属性ルックアップ foo.bar 本当に 遅いんだよ!

以下は小さなものです。 イラスト ローカル変数の効率について。