リストへの追加はリスト内包よりも大幅に遅いのはなぜですか?
リスト内包は、その簡潔さと効率のため、Python で人気が高まっています。これは通常の for ループの構文上のショートカットのように見えますが、特にリストに要素を追加する場合に、パフォーマンスに大きな利点があります。
違いのベンチマーク
検討次のコード スニペット:
import timeit timeit.timeit(stmt=''' t = [] for i in range(10000): t.append(i)''', number=10000) timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
結果から明らかなように、リストの理解は大幅に高速であり、追加アプローチよりも約 50% 優れています。
理由の詳細
リスト内包表記は本質的に、既存の反復可能オブジェクトに基づいて新しいリストを生成する構文構造です。 appending メソッドとは異なり、反復ごとに append 属性を取得して呼び出す必要はありません。
コード逆アセンブリ
逆アセンブラーを使用したより深い分析により、洞察が得られます。根本的な違いについて説明します:
# Function using appending dis.dis(f1)
追加を使用する関数の逆アセンブルされたコードでは、反復ごとに顕著な LOAD_METHOD と CALL_METHOD のペアがあります (バイトコード 18 ~ 22)。これらの命令は、オーバーヘッドが発生する追加属性のロードと呼び出しを処理します。
# Function using list comprehension dis.dis(f2)
対照的に、リスト内包バージョン (バイトコード 10 ~ 12) には、単一の CALL_FUNCTION 命令が含まれます。この命令は、属性の取得を必要とせずに新しいリストを効率的に構築します。
結論
リスト理解の効率の向上は、その最適化された実装によるものです。 append 属性の繰り返しのロードと呼び出しを回避することで、リスト内包表記によりオンデマンドでリストが作成され、特に大規模な反復を扱う場合にパフォーマンスが大幅に向上します。
以上がリストの内包理解が、Python でリストに追加するよりも大幅に速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。