創屋ぷれす

Python の yield

yield を含む関数はジェネレーター関数になります。処理を一度にすべて実行するのではなく、値を一つずつ生成し、そのたびに一時停止して、次に呼ばれたときに続きから再開します。例えるなら、一気に全話公開するのではなく、毎週新しいエピソードを更新していく ONE PIECE のような仕組みです。

この仕組みは次のような場面で非常に強力です:

  • 大規模データセット
  • ストリーミングデータ
  • データを段階的に変換するパイプライン
  • すべてのデータをメモリ上に置く必要がない場合

たとえば、数百 MB の巨大なテキストファイルを処理するとします。ファイル全体を一度にメモリへ読み込むと、メモリを無駄に消費したり、プログラムが遅くなったり、最悪メモリ不足でクラッシュする可能性があります。以下はジェネレーターを使った例です:

def read_lines(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield line.strip()

for line in read_lines('large.txt'):
    print(line)

このコードでは、メモリ上に存在するのは常に 1 行だけです。

次に、同等の処理を行う一般的な関数を見てみましょう:

def read_lines_all(filename):
    with open(filename, 'r') as f:
        return [line.strip() for line in f]

for line in read_lines_all('large.txt'):
    print(line)

こちらのコードでは、すべての行をリストとしてまとめて返します。ファイルが巨大な場合、メモリ使用量が一気に増えてしまいます。

創屋のホームページはこちらから

Post navigation

Comments are closed.