ホームページ >バックエンド開発 >Python チュートリアル >関数内で実行すると Python コードが高速になるのはなぜですか?
関数内で Python コードがより迅速に実行されるのはなぜですか?
ループを 1 億回実行する以下の Python コード スニペットを考えてみましょう。
def main(): for i in range(10**8): pass main()
Linux で time 関数を使用して測定すると、このコードは驚くほど高速に実行されます。
real 0m1.841s user 0m1.828s sys 0m0.012s
興味深いことに、for ループが関数内に囲まれずに実行されると次のようになります。
for i in range(10**8): pass
実行時間が大幅に増加します:
real 0m4.543s user 0m4.524s sys 0m0.012s
この不一致はなぜ発生しますか?
関数の内部
コードが関数内にある場合、バイトコードは次のことを明らかにします:
2 0 SETUP_LOOP 20 (to 23) 3 LOAD_GLOBAL 0 (xrange) 6 LOAD_CONST 3 (100000000) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 6 (to 22) 16 STORE_FAST 0 (i) 3 19 JUMP_ABSOLUTE 13 >> 22 POP_BLOCK >> 23 LOAD_CONST 0 (None) 26 RETURN_VALUE
関数の外
対照的に、コードがトップレベルで実行される場合、バイトコードは次のとおりです。
1 0 SETUP_LOOP 20 (to 23) 3 LOAD_NAME 0 (xrange) 6 LOAD_CONST 3 (100000000) 9 CALL_FUNCTION 1 12 GET_ITER >> 13 FOR_ITER 6 (to 22) 16 STORE_NAME 1 (i) 2 19 JUMP_ABSOLUTE 13 >> 22 POP_BLOCK >> 23 LOAD_CONST 2 (None) 26 RETURN_VALUE
問題の核心
違いは、STORE_FAST と STORE_NAME の使用にあります。 STORE_FAST は、変数 (この場合、i) がローカル変数 (関数内) である場合に使用され、STORE_NAME は変数がグローバル変数 (関数外) である場合に使用されます。前者の方が大幅に効率的です。
これは、変数がローカルとして宣言されると、インタープリターがその変数に特定のメモリ位置を使用するようにコードを最適化できるという事実によって説明できます。ただし、変数がグローバルとして宣言されている場合、インタープリターは変数を見つけるためにグローバル スコープ全体を検索する必要があり、より時間のかかるプロセスになります。
以上が関数内で実行すると Python コードが高速になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。