らふのプログラミングメモ

プログラミングメモです。

ジェネレータ式を使ってみよう

内包表記にそっくりな表記方法で ジェネレータ式というのがあります。

今日はそれについてのまとめをしていきたいと思います。

 どれくらい似てるの?

例題: 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つずつ生成するため、処理時間がかかりにくいそうです。

実際に負荷をかけたプログラムを実行して、時間を測ってみよう。

昨日まとめた時間を計測する方法を使ってみよう。

rafu.hatenablog.jp

負荷をかけたいので、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 投稿