ホームページ > バックエンド開発 > Python チュートリアル > リストの内包理解が、Python でリストに追加するよりも大幅に速いのはなぜですか?

リストの内包理解が、Python でリストに追加するよりも大幅に速いのはなぜですか?

Patricia Arquette
リリース: 2024-10-28 03:47:02
オリジナル
396 人が閲覧しました

Why is List Comprehension Significantly Faster Than Appending to a List in Python?

リストへの追加はリスト内包よりも大幅に遅いのはなぜですか?

リスト内包は、その簡潔さと効率のため、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 サイトの他の関連記事を参照してください。

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