0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python ジェネレータ式でメモリ使用量を劇的に削減!

Last updated at Posted at 2024-08-20

はじめに

こんにちは!今回は、Pythonのちょっとしたテクニックで、プログラムのメモリ効率を大幅に改善する方法をご紹介します。その秘密兵器とは…ジェネレータ式です!

image.png

はじめに

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スキル向上の一助となれば幸いです。質問やコメントがありましたら、ぜひ下のコメント欄でお聞かせください!

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?