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

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

DDD
DDDオリジナル
2024-11-01 12:54:29185ブラウズ

 Why Are Python List Comprehensions So Much Faster Than Appending to Lists?

Python のリスト内包表記がリストの追加を上回る理由

Python プログラマは、リスト内包表記とリストへの追加の間に大きなパフォーマンスのギャップがあることによく気づきます。リスト内包表記は構文上の利便性として一般に認識されていますが、単なる表現力を超えた優れた速度を示しています。

この現象を説明するには、次の timeit 測定を考慮してください。

>>> import timeit
>>> timeit.timeit(stmt='''
t = []
for i in range(10000):
    t.append(i)''', number=10000)
9.467898777974142

>>> timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
4.1138417314859

次のことから明らかです。測定によると、リストの理解は追加よりも 50% 近く高速です。根本的な理由を詳しく見てみましょう。

糖衣構文の誤謬

リスト内包表記は、通常の for ループの単なる糖衣構文ではありません。これらにより、反復ごとに append 属性にアクセスして呼び出すことに関連するオーバーヘッドが回避されます。これにより、リストを直接構築するよりも本質的に遅い複数の関数フレームの一時停止と再開が排除されます。

バイトコードの比較

2 つのアプローチの逆アセンブルされたバイトコードを調べると、パフォーマンスの違いが明らかになります。

# Appending to a List
  18 LOAD_FAST                0 (l)
  20 LOAD_METHOD              1 (append)
  22 LOAD_FAST                1 (i)
  24 CALL_METHOD              1
  26 POP_TOP

# List Comprehension
              2 BUILD_LIST               0
              8 LOAD_FAST                1 (i)
             10 LIST_APPEND              2

最初の関数での append メソッドの呼び出しでは追加のオーバーヘッドが発生しますが、リストの内包では新しく作成されたリストが直接拡張されます。

実際的な意味

パフォーマンスが最優先されるシナリオ、リスト内包表記は、リストに追加するよりも優先されるアプローチである必要があります。優れた速度は、無関係なバイトコードと関数呼び出しのオーバーヘッドをバイパスする機能に由来します。

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

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