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.