Tips

リスト内包表記 (メモリ消費大)

Pythonのジェネレータを活用して、メモリ効率の良いイテレータを作成し、大規模データ処理時のパフォーマンスを向上させるテクニックです。特に、メモリに乗り切らないような巨大なファイルを扱う際に効果を発揮します。

Python

Pythonのジェネレータを活用して、メモリ効率の良いイテレータを作成し、大規模データ処理時のパフォーマンスを向上させるテクニックです。特に、メモリに乗り切らないような巨大なファイルを扱う際に効果を発揮します。

ジェネレータ式でメモリ消費を抑える

大規模なデータセットを処理する際、リスト内包表記でデータを一度にメモリにロードすると、メモリ不足になる可能性があります。ジェネレータ式は、必要に応じて値を生成するため、メモリ消費を大幅に削減できます。

# リスト内包表記 (メモリ消費大)
data = [i * 2 for i in range(1000000)]
# print(sum(data))

# ジェネレータ式 (メモリ消費小)
data_generator = (i * 2 for i in range(1000000))
print(sum(data_generator)) # ジェネレータは一度使い切ると再利用できない

# ファイルの行をジェネレータで処理する例
def process_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield line.strip()  # 空白文字を削除した行を生成

# ファイルが存在する場合のみ処理する
try:
    for line in process_file('large_file.txt'):
        # 各行に対して処理を行う
        # print(line) # コメントアウト解除で確認
        pass
except FileNotFoundError:
    print("ファイルが見つかりませんでした。")

注意点:

  • ジェネレータは一度イテレートすると、要素を再利用できません。再利用する場合は、再度ジェネレータを作成する必要があります。
  • FileNotFoundErrorの例外処理を追加し、ファイルが存在しない場合にプログラムがクラッシュしないようにしました。

おすすめポイント:

  • ジェネレータ式は、リスト内包表記と似た構文で記述できるため、簡単に導入できます。
  • 大規模データを扱う処理だけでなく、無限数列のようなメモリに保持できないデータを扱う場合にも有効です。
  • yield文を使用することで、複雑なロジックを持つジェネレータ関数を簡単に作成できます。