ホームページ  >  記事  >  バックエンド開発  >  Python ではリストの内包表記がリストの追加よりも速いのはなぜですか?

Python ではリストの内包表記がリストの追加よりも速いのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 16:58:29123ブラウズ

Why Are List Comprehensions Faster Than List Appending in Python?

リスト内包表記がリストの追加よりも優れている理由

リスト内包表記は単なる表現力の砂糖として認識されているにもかかわらず、リスト内包表記はリストの追加よりも速度に大きな利点があることが実証されています。 。この相違は、表現上の違いを超えて広がります。

説明のために、次の timeit ベンチマークを考えてみましょう:

<code class="python">import timeit

time = timeit.timeit('t=[]\nfor i in range(10000):\n    t.append(i)', number=10000)
time2 = timeit.timeit('t=[i for i in range(10000)]', number=10000)</code>

結果から、リスト内包表記はリストに追加するよりも約 50% 高速に実行されることがわかります。

速度が向上する理由

リスト内包表記は、いくつかのパフォーマンスの最適化を利用します:

  • 属性のロードと関数呼び出しの排除:リストの追加では、各反復でリストの append 属性をロードし、それを関数として呼び出す必要があります。リスト内包表記は、オンデマンドで新しいリストを作成することでこのオーバーヘッドを排除します。
  • 一時停止と再開と即時リスト作成: 関数のフレームの一時停止と再開は、一般にオンデマンドでリストを直接作成するよりも遅くなります。 .

次のコード スニペットを考えてみましょう:

<code class="python">def f1():
    l = []                                    # Create a new list
    for i in range(5):                      # Iterate through a range
        l.append(i)                         # Append each number to the list

def f2():
    [i for i in range(5)]                  # Use list comprehension to create a new list</code>

これらの関数を dis モジュールで逆アセンブルすると、違いが明らかになります。

<code class="python">dis.dis(f1)
dis.dis(f2)</code>

f1 では、リストの作成と、append 属性 (オフセット 18 と 20) の読み込みと呼び出しを観察します。ただし、f2 ではこれらの操作が存在しないため、より効率的なコードが得られます。

結論

リスト内包表記は、属性の読み込み、関数呼び出し、および関数呼び出しを排除することでパフォーマンスの向上を実現します。機能フレームの一時停止と再開に関連するオーバーヘッド。したがって、速度が優先される新しいリストの作成には、これらが推奨されることがよくあります。

以上がPython ではリストの内包表記がリストの追加よりも速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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