【Python】ジェネレータの使い方:メモリ効率の良いイテレーション

Python
この記事は約5分で読めます。

こんにちは、JS2IIUです。
Pythonのジェネレータは、メモリ効率の良いイテレーションを実現するための強力なツールです。この記事では、ジェネレータの基本から応用まで、サンプルコードを交えながら解説します。今回もよろしくお願いします。

ジェネレータとは?

ジェネレータは、イテレータを生成するための特別な関数です。通常の関数がreturn文で値を返すのに対し、ジェネレータはyield文を使って値を返します。yield文が呼び出されると、ジェネレータの状態が一時停止し、呼び出し元に値が返されます。次にジェネレータが呼び出されると、一時停止した状態から処理が再開されます。

ジェネレータのメリット

  • メモリ効率: ジェネレータは、一度に全ての要素をメモリに保持せず、必要に応じて要素を生成するため、大量のデータを扱う場合にメモリ使用量を大幅に削減できます。
  • 遅延評価: ジェネレータは、必要になるまで要素の生成を遅らせるため、時間効率も向上します。
  • コードの可読性: ジェネレータを使うことで、複雑なイテレーション処理を簡潔に記述できます。

ジェネレータの使いどころ

  • 大規模データの処理: ログファイルの解析やデータベースからのデータ抽出など、メモリに乗り切らないデータを扱う場合に有効です。
  • 無限シーケンスの生成: フィボナッチ数列や素数など、無限に続くシーケンスを生成する際に便利です。
  • パイプライン処理: 複数の処理を組み合わせ、データを段階的に処理する際に適しています。

サンプルコード

1. フィボナッチ数列ジェネレータ

Python
def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

# ジェネレータを使用
for num in fibonacci(10):
    print(num)

解説:

  1. fibonacci関数は、指定された上限値までのフィボナッチ数列を生成するジェネレータです。
  2. yield aで現在のフィボナッチ数を返します。
  3. a, b = b, a + bで次のフィボナッチ数を計算します。
  4. forループでジェネレータから値を受け取り、出力します。

2. ファイル読み込みジェネレータ

Python
def read_large_file(file_path):
    with open(file_path, 'r') as file:
        while True:
            line = file.readline()
            if not line:
                break
            yield line.strip()

# ジェネレータを使用
for line in read_large_file('large_file.txt'):
    print(line)

解説:

  1. read_large_file関数は、大きなファイルを読み込み、行ごとに返すジェネレータです。
  2. file.readline()で1行ずつ読み込みます。
  3. yield line.strip()で読み込んだ行を返します。
  4. forループでジェネレータから値を受け取り、出力します。

3. 素数生成ジェネレータ

Python
def primes():
    num = 2
    while True:
        if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
            yield num
        num += 1

# ジェネレータを使用
prime_generator = primes()
for _ in range(10):
    print(next(prime_generator))

解説:

  1. primes関数は、素数を無限に生成するジェネレータです。
  2. all(num % i != 0 for i in range(2, int(num**0.5) + 1))で素数判定を行います。
  3. yield numで素数を返します。
  4. next(prime_generator)でジェネレータから次の素数を受け取り、出力します。

参考WEBサイト

ジェネレータを使いこなして、Pythonプログラミングをさらに効率化しましょう!

ジェネレータについて、さらに応用的な内容を知りたい方はこちらの記事も参考にしてみてください。

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました