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