Python List内包表記 vs. Generator



Page content


PythonでList内包表記をとGeneratorをどう使い分けるか。

# List comprehension
>>> lst = [x*2 for x in range(10)]
>>> lst
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# Generator expression
>>> gen = (x*2 for x in range(10))
>>> next(gen)
0
>>> next(gen)
2

List内包表記を使う場面

List内包表記は、全ての要素を計算し、保持して返却します。

なので、indexやsliceを使って途中要素にアクセスしたり、何度も同じ要素にアクセスする場合に利用します。

  • 結果を繰り返し利用する場合
  • 特定要素にアクセスする場合

Generatorを使う場面

Generatorは作成時点で各要素を計算するわけではありません。
yieldを使い、返却する値のみを計算します。
そのため、要素が膨大/無限でリストに保持しておけない場合や、一周しか利用しないため保持する必要がない場合に利用します。

  • 扱う範囲が大きい、或いは無限の場合
  • 結果を一度しか利用しない場合

ちなみに、allanyの引数にList内包表記を指定すると、pylintでGeneratorにしろと指摘されるようです。

...[R1729(use-a-generator), ...] Use a generator instead 'all(x*2 for x in range(10))'

参考