Pythonでリスト内包表記がforループよりも優れたパフォーマンスを発揮するのはなぜですか?
リスト内包表記:
new_items = [a for a in items if a > 10]
for ループ:
new_items = []
for a in items:
if a > 10: new_items.append(a)
ある Python 構造が別の Python 構造よりもパフォーマンスが悪い他の例 (ループではない) はありますか?
Pythonでリスト内包表記がforループよりも優れたパフォーマンスを発揮するのはなぜですか?
リスト内包表記:
new_items = [a for a in items if a > 10]
for ループ:
new_items = []
for a in items:
if a > 10: new_items.append(a)
ある Python 構造が別の Python 構造よりもパフォーマンスが悪い他の例 (ループではない) はありますか?
基本的に、リスト内包表記と for ループはかなり似たようなことを行いますが、リスト内包表記はいくつかのオーバーヘッドを取り除き、見栄えを良くします。なぜこれが高速なのかを理解するには、リスト内包表記の効率を調べて、問題に関連する部分を引用する必要があります。
ここではリスト内包表記のパフォーマンスが向上します。これは、append 属性をリストからロードして (ループ プログラム、バイトコード 28)、それを関数として呼び出す (ループ プログラム、バイトコード 38) 必要がないためです。代わりに、内包表記では、特殊な LIST_APPEND バイトコードが生成され、結果リストに高速に追加されます (内包表記プログラム、バイトコード 33)。
loop_faster プログラムでは、追加属性ルックアップのオーバーヘッドをループから引き上げて結果を fastlocal (バイトコード 9-12) に配置することで回避し、より迅速にループします。ただし、内包表記は、関数呼び出しのオーバーヘッドを発生させる代わりに、特殊な LIST_APPEND バイトコードを使用するため、依然として切り札です。
このリンクには、lc に関連する可能性のある落とし穴の詳細も記載されています。一度確認することをお勧めします。
パイソンウィキより
for ステートメントが最も一般的に使用されます。シーケンスの要素をループし、それぞれをループ変数に割り当てます。ループの本体が単純な場合、for ループ自体のインタープリター オーバーヘッドがかなりの量になる可能性があります。そこで便利なのが地図機能です。map は for を C コードに移動したものと考えることができます。
非常に単純な for ループには、リスト内包表記が回避できるオーバーヘッドがあります。