
データを作成する
for i in (x*3 for x in [1, 2, 3, 4, 5]):
print(i)
コードを囲む丸かっこ
==
ジェネレータ
リスト内包表記のように見えるのに、
()
で囲まれているコードがあったら、それは
ジェネレータです。
前ページの最後に示したように、リスト内包表記を囲む
[]
を
()
に置き換えても、
結果は同じです。つまり、ジェネレータとリスト内包表記は同じデータを作成します。
しかし、同じようには実行されません。
上の文がわかりにくいようなら、次のように考えてください。リスト内包表記を実
行すると、他の処理が発生する前にすべてのデータを作成します。このページの先頭
の例で考えると、
for
ループはリスト内包表記が完了するまでデータの処理を始めま
せん。つまり、リスト内包表記はデータ作成に長い時間がかかり、他のコードの実行は
それだけ遅れます。
これは(上のように)データ項目が少ないリストでは大し
た問題ではありません。
しかし、データ項目が
1
千万ある場合を想像してください。すると、
2
つの問題が生
じます。(
1
)リスト内包表記がこの
1
千万のデータ項目を処理するまでその他の処理を
待たなければいけません。そして、(
2
)リスト内包表記の実行中に全データ(1 千万の
データ項目)をメモリに置けるような十分な
RAM
がリスト内包表記を実行するマシン
にあるかどうかに注意する必要があります。リスト内包表記がメモリを使い果たした
ら、インタプリタは停止します(そして、プログラムは終了します) ...