8

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 構造よりもパフォーマンスが悪い他の例 (ループではない) はありますか?

4

3 に答える 3

16

基本的に、リスト内包表記と for ループはかなり似たようなことを行いますが、リスト内包表記はいくつかのオーバーヘッドを取り除き、見栄えを良くします。なぜこれが高速なのかを理解するには、リスト内包表記の効率を調べて、問題に関連する部分を引用する必要があります。

ここではリスト内包表記のパフォーマンスが向上します。これは、append 属性をリストからロードして (ループ プログラム、バイトコード 28)、それを関数として呼び出す (ループ プログラム、バイトコード 38) 必要がないためです。代わりに、内包表記では、特殊な LIST_APPEND バイトコードが生成され、結果リストに高速に追加されます (内包表記プログラム、バイトコード 33)。

loop_faster プログラムでは、追加属性ルックアップのオーバーヘッドをループから引き上げて結果を fastlocal (バイトコード 9-12) に配置することで回避し、より迅速にループします。ただし、内包表記は、関数呼び出しのオーバーヘッドを発生させる代わりに、特殊な LIST_APPEND バイトコードを使用するため、依然として切り札です。

このリンクには、lc に関連する可能性のある落とし穴の詳細も記載されています。一度確認することをお勧めします。

于 2013-06-03T23:22:41.420 に答える
2

パイソンウィキより

for ステートメントが最も一般的に使用されます。シーケンスの要素をループし、それぞれをループ変数に割り当てます。ループの本体が単純な場合、for ループ自体のインタープリター オーバーヘッドがかなりの量になる可能性があります。そこで便利なのが地図機能です。map は for を C コードに移動したものと考えることができます。

非常に単純な for ループには、リスト内包表記が回避できるオーバーヘッドがあります。

于 2013-06-03T23:20:47.710 に答える