はじめに
こんにちは!今回は、Pythonのちょっとしたテクニックで、プログラムのメモリ効率を大幅に改善する方法をご紹介します。その秘密兵器とは…ジェネレータ式です!
はじめに
Pythonを使い始めてしばらく経つと、リスト内包表記の便利さに気づくことでしょう。でも、大量のデータを扱うときに「メモリ不足」で悩んだことはありませんか?そんなときこそ、ジェネレータ式の出番です!
ジェネレータ式とは?
ジェネレータ式は、リスト内包表記の兄弟のようなものです。構文はほとんど同じですが、[]
の代わりに()
を使います。
例えば:
# リスト内包表記
squares_list = [x**2 for x in range(1000000)]
# ジェネレータ式
squares_gen = (x**2 for x in range(1000000))
一見似ていますが、メモリの使い方が全然違うんです!
なぜジェネレータ式がメモリ効率が良いの?
ジェネレータ式は、すべての要素を一度に生成するのではなく、必要なときに1つずつ生成します。これを「遅延評価」と呼びます。
実際にメモリ使用量を比較してみましょう:
import sys
# リスト内包表記
squares_list = [x**2 for x in range(1000000)]
print(f"リストのメモリ使用量: {sys.getsizeof(squares_list) / (1024 * 1024):.2f} MB")
# ジェネレータ式
squares_gen = (x**2 for x in range(1000000))
print(f"ジェネレータのメモリ使用量: {sys.getsizeof(squares_gen) / 1024:.2f} KB")
実行結果:
リストのメモリ使用量: 8.00 MB
ジェネレータのメモリ使用量: 0.11 KB
驚きの差ですよね!
ジェネレータ式の使い方
ジェネレータ式は、for文で簡単に使えます:
gen = (x**2 for x in range(5))
for num in gen:
print(num)
出力:
0
1
4
9
16
ただし、ジェネレータは一度しか反復できないので注意が必要です:
gen = (x**2 for x in range(5))
print(list(gen)) # [0, 1, 4, 9, 16]
print(list(gen)) # [] # 2回目は空のリストになる!
まとめ
ジェネレータ式を使うことで、メモリ使用量を大幅に削減できます。特に大量のデータを扱う場合や、データの生成に時間がかかる場合に効果を発揮します。
ぜひ、あなたのコードでも試してみてください。メモリ効率が上がるだけでなく、処理速度の向上にもつながるかもしれません!
次回は、ジェネレータ関数についても詳しく解説する予定です。お楽しみに!
参考リンク
最後まで読んでいただき、ありがとうございました。この記事が皆さんのPythonスキル向上の一助となれば幸いです。質問やコメントがありましたら、ぜひ下のコメント欄でお聞かせください!