関数を使用した Python コードのパフォーマンスの最適化
Python の関数内で特定のコードを実行すると、実行速度が大幅に向上することが確認されています。この奇妙な動作の背後にある理由を調べてみましょう。
当初、for ループは関数内にカプセル化されていました。
def main(): for i in xrange(10**8): pass main()
このコードは、2 秒未満で完了する、賞賛に値するパフォーマンスを示します。ただし、for ループが関数内に囲まれずに独立して実行された場合:
for i in xrange(10**8): pass
その実行時間は 4 秒以上に急増しました。この相違の背後にある謎を解明するには、Python インタプリタによって生成されたバイトコードを詳しく調べる必要があります。
関数のバイトコードを調べると、変数 i が STORE_FAST オペコードを使用して割り当てられていることがわかります。
LOAD_FAST 0 (i)
for ループがトップレベルで実行されると、変数 i は STORE_NAME オペコードを使用して割り当てられます。
STORE_NAME 1 (i)
重要なことに、STORE_FAST は STORE_NAME よりも効率的な操作であることが確認されています。 。この効率は、i が関数内のローカル変数である場合 (STORE_FAST を使用)、スタック フレームに格納されるという事実から生じます。対照的に、i がグローバル変数である場合 (STORE_NAME を使用)、グローバル変数のディクショナリに保存する必要があります。
バイトコードをさらに検査するには、dis モジュールを利用できます。関数を直接逆アセンブリするには、dis モジュールを使用できます。ただし、トップレベルで実行されるコードを逆アセンブリするには、コンパイル組み込みを利用する必要があります。
基礎となるバイトコード操作を理解することで、Python の関数の力を利用して、コードの実行速度を効果的に最適化できます。
以上がコードを関数にカプセル化すると、Python のパフォーマンスが向上するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。