nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

yield (generator) の有り難みとは?: python

fortran77及び90・95上がりからすると、昨今のモダンな言語のノリになかなかついて行けないでやんです(バカでごめんなさい)。

そもそもファイルのreadに関して一行ずつ読むのがデフォルトのfotran脳的には、python様がどこでどうメモリを消費しているか、またループが露わに出ていないためどこが律速かわからないのであります。
1GBのファイルを開いてデータを読み込むのを目的とした時に、以下の操作でメモリを食うのか食わんのかがpython様が裏で働き過ぎててわからぬ。

  1. f = open( filename, "w" ) でファイルを開いた時
  2. num_line = sum( 1 for line in open( filename ) ) で行数を数える時
  3. line = f.readline() で一行だけ読んだ時

行数を数えるアルゴリズムは以下から参照
text files - How to get line count cheaply in Python? - Stack Overflow

そりゃあread()やreadlines()でファイルの中身を丸ごと扱おうとしてメモリが足りないとかはわかる。しかしどこで何がどうメモリ使うのかがイマイチわからん。
(「1GBのファイルを用意して自分で一個一個やってどれくらいメモリ食うか自分で調べろよ」という声をここでは盛大に無視することをお許し願いたい。)

こういう思考回路を背景にネット上を徘徊すると、pythonにはyield (generator)という機能があるという事実に出会う。
generatorは以下のサイトが分かり易かった。
ailaby.com

一個一個やるからgeneratorは省メモリですよ〜というノリはわかった。ということは、ファイルを開くだけならばメモリは大して使わないのだろうということは何となく類推出来る。
まさに行数を数えるものを作ろうとする際には、ファイルを丸ごと読み込んでメモリ不足で動かないという事態を起こすことなく安全に処理出来る。
しかし、例えば膨大なデータをプロットしたいとかなった時には、結局全部のデータが必要で、一個一個扱おうがそれをリスト変数なり何なりに格納する場合にはgeneratorの恩恵は無さそうに思える。

自分はビックデータを扱う分野にはまだいないので、何をどうズル工夫してメモリの問題を避けているのかが、イマイチ掴めていない。アルゴリズム等によるメモリ節約の寄与と、メモリを摘みまくったPCの物理的な寄与のどっちが支配的なのかがわからんです。何となく機械学習のプログラムが発達して来たからという風潮を感じつつも、何でもノートPC上で出来る魔法みたいなことは起こってなくて実際は金に物を言わせてる感が否めない。もっと勉強します。