5章イテレータとジェネレータ

5章を読めば以下の問いに答えられるようになる
  • いかにしてジェネレータはメモリを節約するか?
  • ジェネレータを使うべき場面はどのようなときか?
  • itertoolsを使って、複雑なジェネレータを定義する方法は?
  • 遅延評価が便利な場面と、そうでないときの違いは?

 Python以外の言語の経験者がPythonを学び始めると、forループの書き方が違うことに衝撃を受けます。つまり、次のように書く代わりに、

# 他の言語の場合
for (i=0; i<N; i++) {
    do_work(i);
}

 rangeという関数を使って次のように書きます。

# Pythonの場合
for i in range(N):
    do_work(i)

 Pythonのサンプルコードでは、rangeという関数を呼び出して、forループに必要なデータを作成しているようです。直感的には、1から100,000,000までの数字をループさせようとすると、その配列の作成に時間がかかってしまいそうです。そういうときこそ、ジェネレータの出番です。ジェネレータでは、この種の関数を遅延評価できるので、性能に影響を受けることなく、読みやすいコードを書くことができます。

 この概念を理解するために、フィボナッチ数を計算する関数を、リストを埋める方法とジェネレータを使う方法で実装してみましょう。

def fibonacci_list(num_items): numbers = [] a, b = 0, 1 while len(numbers) < num_items: numbers.append(a) a, b = b, a + b return numbers def fibonacci_gen(num_items): ...

Get ハイパフォーマンスPython 第2版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.