ホームページ  >  記事  >  バックエンド開発  >  関数のカプセル化により Python コードの実行速度が向上するのはなぜですか?

関数のカプセル化により Python コードの実行速度が向上するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-13 07:29:02882ブラウズ

Why Does Function Encapsulation Enhance Python Code Execution Speed?

関数のカプセル化によるコード実行速度の向上

Python コードを実行すると、関数内に含まれるコードは、関数内に含まれるコードの方が大幅に高速に実行されることがわかります。同じコードが関数の外で実行されます。この現象を調査するために、簡単なコード スニペットを分析してみましょう。

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

このコードは、main() 関数内で実行すると約 1.8 秒で実行されます。ただし、for ループが関数の外側に配置されている場合、実行時間は約 4.5 秒に増加します。

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

このパフォーマンスの差の理由は、Python がコードをコンパイルする方法にあります。コードが関数内で実行されると、バイトコードとして知られる形式にコンパイルされます。バイトコードは、Python 仮想マシン (PVM) が元の Python コードより効率的に実行する一連の命令です。

dis モジュールを使用してコード スニペットのバイトコードを調べると、違いが明らかになります。

関数内:

  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        

決定的な違いは、16 行目と 19 行目の命令です。関数内では、変数 i はローカル変数用に最適化された STORE_FAST を使用して保存されます。ただし、関数の外側では、i は STORE_NAME を使用して保存されます。これはグローバル変数に関係するため、より計算量が多くなります。

そのため、コードを関数内にカプセル化することで、変数の保存と取得を最適化します。実行時間が短縮されます。

以上が関数のカプセル化により Python コードの実行速度が向上するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。