【Python】Generatorを使うメリット

この記事では、PythonのGenerator(ジェネレータ)を使うメリットをご紹介します。

ジェネレータはリストに似ていますが、メモリ消費の観点からみると全然違います。

Listを使った処理ではメモリを消費しますが、generatorを使うとメモリを消費しません。

その違いについてコードを見ながら説明していきます。

リスト

リストで与えた数値の三乗を計算して返す関数を作ってみます。

実行結果は以下の通り。

リストとして計算結果が返ってきました。

ジェネレータ

ジェネレータを使って、同じ関数を書いてみます。

ジェネレータを使うときには、returnの代わりにyieldを使います。

実行結果は以下の通り。

全く同じ結果が得られました。

Generatorクラスは、リストと同じようにfor文で回して値を取り出すことができます。

メモリ使用量の違い

リストでもジェネレータでも同じ結果が得られました。

それではジェネレータを使うメリットとは何でしょうか?

メモリ使用量を見てみましょう。Memory_profilerを使うと良いです。

Google colabではデフォルトで入っていなかったので、pip installでインストールしました。

まずはリストの場合の実行結果です。

今度はわかりやすいように1~100万までの数値の3乗を返すようにします。

リストの数値が少ないとあまりメモリを消費しませんからね。

メモリ使用量だけでなく、timeで時間も計測します。

8マイクロ秒で、55Mのメモリを消費したことが分かりました。

同様のコードをジェネレータで実装してみます。

実行時間はほとんど同じで、メモリ使用量を0Mに抑えられました。

全く同じ処理をしているのですが、メモリを消費せずに済みます

しかも、実行速度はほとんど変わりません。

これがジェネレータを使う大きなメリットです。

参考

https://medium.com/@chetaniam/optimize-python-code-with-generators-aef839996ee4