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

DDD
リリース: 2024-11-01 12:54:29
オリジナル
190 人が閲覧しました

 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!