ジェネレータ式を使ってみよう
内包表記にそっくりな表記方法で ジェネレータ式というのがあります。
今日はそれについてのまとめをしていきたいと思います。
どれくらい似てるの?
例題: y = 2x + 10 (0≦x≦10) を求めてみよう
- For文で作ってみよう
y = [] for x in range(10): y.append(2 * x + 10) print(y)
- 内包表記で書いてみよう
z = [] z = [2*x+10 for x in range(10)] print(z)
- ジェネレータ式で書いてみよう
w = [] w = (2*x+10 for x in range(10)) print(list(w))
違いは見つかりましたか? 内包表記は括弧が[ ]ですが、ジェネレータ式は( )です。
内包表記とジェネレータ式って何が違うの?
内包表記 最初にすべての整数を実機に生成しようとするため、処理時間がかかるそうです。
ジェネレータ式 要求に応じてその都度整数を1つずつ生成するため、処理時間がかかりにくいそうです。
実際に負荷をかけたプログラムを実行して、時間を測ってみよう。
昨日まとめた時間を計測する方法を使ってみよう。
負荷をかけたいので、xの範囲を0以上1億以下に変更します。
- For文
import time y = [] y_b = time.perf_counter() for x in range(100000000): y.append(2 * x + 10) y_a = time.perf_counter() y_t = y_a - y_b print(y_t)
結果:14.576659613999936 s
- 内包表記
import time z = [] z_b = time.perf_counter() z = [2*x+10 for x in range(100000000)] z_a = time.perf_counter() z_t = z_a - z_b print(z_t)
結果:8.063755885000091 s
- ジェネレータ式
import time w = [] w_b = time.perf_counter() w = (2*x+10 for x in range(100000000)) w_a = time.perf_counter() w_t = w_a - w_b print(w_t)
結果:6.813899994995154e-05 s
1億回appendをさせてみたところ、結果は以下のとおり
処理方法 | かかった時間(秒) |
---|---|
For | 14.6 |
内包表記 | 8.1 |
ジェネレータ式 | 0.000068 |
このように、ジェネレータ式を使うと処理が早くなるのがわかります。
<最終更新日:2021/09/02>
2021/09/02 投稿