ホームページ > バックエンド開発 > Python チュートリアル > 関数内で実行すると Python コードが高速になるのはなぜですか?

関数内で実行すると Python コードが高速になるのはなぜですか?

DDD
リリース: 2024-11-15 13:17:03
オリジナル
475 人が閲覧しました

Why is Python Code Faster When Executed Inside a Function?

関数内で 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート