カテゴリ: Python 更新日: 2025/12/15

Pythonのリストのメモリ効率を改善する方法を完全ガイド!初心者でもわかるgeneratorの使い方

Pythonのリストのメモリ効率を改善する方法!generatorを活用した省メモリ化
Pythonのリストのメモリ効率を改善する方法!generatorを活用した省メモリ化

先生と生徒の会話形式で理解しよう

生徒

「先生、Pythonでたくさんのデータをリストに入れると、パソコンが重くなってしまうんですが…」

先生

「その悩み、Pythonのgenerator(ジェネレータ)を使えば解決できますよ。リストの代わりに使えば、メモリを大きく節約できます。」

生徒

「リストの代わりに使うってどういう意味ですか?」

先生

「一度に全部メモリに読み込むのではなく、必要なときだけ1個ずつ取り出す仕組みなんです。これが省メモリ化の鍵です。」

1. リストとメモリの関係とは?

1. リストとメモリの関係とは?
1. リストとメモリの関係とは?

Pythonのリストは便利ですが、大きなデータを一気に入れるとメモリをたくさん使ってしまいます。

たとえば、100万個の数字をリストにすると:


numbers = [x for x in range(1000000)]

この時点で全ての数字がメモリに読み込まれるため、パソコンの動作が重くなることがあります。

2. ジェネレータとは?

2. ジェネレータとは?
2. ジェネレータとは?

generator(ジェネレータ)は、リストのように1つずつ値を順番に取り出せる仕組みですが、すべてを一度に保存せず、必要なときに作るのが特徴です。


numbers = (x for x in range(1000000))

カッコを丸括弧 () にするだけで、リスト内包表記がジェネレータになります。

3. 実際に比べてみよう

3. 実際に比べてみよう
3. 実際に比べてみよう

メモリの使用量には大きな差があります:


import sys

list_data = [x for x in range(1000)]
gen_data = (x for x in range(1000))

print(sys.getsizeof(list_data))
print(sys.getsizeof(gen_data))

9024
112

このように、generatorの方が圧倒的に軽量です。

4. for文と一緒に使うのが基本

4. for文と一緒に使うのが基本
4. for文と一緒に使うのが基本

generatorは、主にfor文と組み合わせて使います。リストと同じように扱えます。


data = (x * 2 for x in range(5))
for item in data:
    print(item)

0
2
4
6
8

1つずつ順番に計算して取り出すため、メモリを無駄に使いません。

5. ジェネレータ式の作り方

5. ジェネレータ式の作り方
5. ジェネレータ式の作り方

通常のリスト内包表記は[]を使いますが、()にするだけでジェネレータになります:


# リスト内包表記
[x * 2 for x in range(10)]

# ジェネレータ式
(x * 2 for x in range(10))

使い方はほとんど同じですが、生成のタイミングが違うのがポイントです。

6. よくある用途と注意点

6. よくある用途と注意点
6. よくある用途と注意点

generatorは次のようなシーンで活躍します:

  • 大量のデータを扱うとき(例:ログ処理、センサーデータ)
  • 読み込みながら処理するストリーミング処理
  • 繰り返し使わず、1回だけ処理したいとき

ただし、一度取り出すと元に戻せないという特徴があります。繰り返して使いたいならリストを使いましょう。

7. 検索キーワードのヒント

7. 検索キーワードのヒント
7. 検索キーワードのヒント

ジェネレータを調べたいときは、次のようなキーワードで検索すると便利です:

  • Python generator 使い方
  • Python メモリ 効率 改善
  • Python ジェネレータ メモリ節約
  • Python for文 ジェネレータ

省メモリ処理は、大量データ時代にとても重要な技術です。

まとめ

まとめ
まとめ

Pythonで大量データを扱うときに避けて通れないのが「メモリの使い方」です。今回の記事では、リストが便利である一方で、多くのデータを抱え込むとパソコンの動作に影響を与えてしまうという根本的な問題を学びました。そして、その問題を根本から解決する鍵となるのがgenerator(ジェネレータ)という仕組みです。ジェネレータは、必要になった瞬間に値を1つずつ生成するという非常に効率的な動作を行うため、大規模データを扱う処理では欠かせない存在になります。

リストはすべての値をメモリ上に展開するため処理が直感的で扱いやすい反面、大量データでは大きな負荷となります。しかしジェネレータは、値を事前に保持せずその場で計算して届けるという仕組みを持っており、結果としてメモリ使用量を大幅に抑えられるという利点があります。今回の例でも、getsizeofで比較してみるとリストとジェネレータではメモリサイズに圧倒的な差があることがわかりました。この違いは、小規模な処理では気にならないかもしれませんが、データ量が指数的に増えていく場面では非常に大きな意味を持ちます。

また、ジェネレータはただの省メモリ手法ではなく、Pythonのコードをより柔軟に、読みやすく整理するうえでも役立ちます。for文との相性は特に良く、順番に値を取り出す処理を自然な形で書くことができますし、通常のリスト内包表記とも似た書き方で表現できるため、記述が簡潔で扱いやすいというメリットもあります。読み進めながら処理していくストリーミング型の処理にも向いており、ログ解析やデータ読み込みなど、現代の大規模データ処理において強力な味方となるでしょう。

一方で、ジェネレータには「使い切ったら戻せない」という注意事項もあります。必要に応じて複数回使うデータであれば、従来通りリストを選択するべき場面もあるでしょう。つまり、リストとジェネレータのどちらが適切かは扱うデータの量、用途、処理の流れによって使い分けることが大切です。今回の記事で学んだように、ジェネレータはデータ量が多い場面ほど有効であり、賢いメモリ設計を実現するうえで欠かせない考え方と言えるでしょう。

ここでは、記事で扱った内容を発展させたサンプルコードを載せておきます。リストとジェネレータの使いどころの違いや、ジェネレータを利用した効率的な処理がどのように書けるかを体感できるはずです。


# リストとジェネレータでメモリ効率を比較しつつ、処理を行う例

import sys

# 大量データを扱う場合のリスト
list_data = [x * 3 for x in range(500000)]
print("リストのメモリ:", sys.getsizeof(list_data))

# ジェネレータで同じ処理を省メモリで実現
gen_data = (x * 3 for x in range(500000))
print("ジェネレータのメモリ:", sys.getsizeof(gen_data))

# ジェネレータで順番に値を処理する例
for i in gen_data:
    if i > 100:  # 簡単な条件で途中で止める
        break
    print(i)

このように、ジェネレータを使えば必要なタイミングで必要な量の計算を行うことができ、リストに比べて無駄なく扱えることがよくわかります。特に、Pythonで大規模なデータ処理を行う場面では効率の良いメモリ管理が求められるため、ジェネレータを活用することは非常に重要です。Pythonの学習が進むにつれて、メモリや処理速度を意識する場面は必ず出てくるため、今回学んだ知識は必ず役立つ場面に出会うでしょう。

今後、ファイル処理、ログ解析、数値計算など、繰り返しデータを扱う処理ではジェネレータが自然に使えるようになると、Pythonプログラミングの幅が一段と広がります。ジェネレータを理解することは、Pythonの書き方をより深く理解し、必要なときに必要なデータを効率よく扱える思考を身につけるための第一歩となります。

先生と生徒の振り返り会話

生徒

「先生、ジェネレータって思ったより便利なんですね!メモリの使い方が全然違うのには驚きました。」

先生

「そうなんです。大量のデータを扱うときには特に威力を発揮しますよ。必要なタイミングだけ値を作るという仕組みがポイントですね。」

生徒

「リストは便利ですけど、大量に入れると重くなるという弱点がよくわかりました。ジェネレータと使い分けることが大事なんですね。」

先生

「その理解はとても良いですね。リストは繰り返し使うデータに向いていますし、ジェネレータは一度だけ順番に処理するようなデータに最適です。」

生徒

「なるほど…用途によって選べばいいんですね。メモリ効率を考えるって大事なんだなと実感しました。」

先生

「これからもっと複雑なデータ処理を学んでいくと、ジェネレータの強みをさらに感じるはずですよ。ぜひいろいろ試してみてください。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Pythonでリストをたくさん使うとメモリが重くなるのはなぜですか?

Pythonのリストはすべてのデータを一度にメモリへ読み込むため、大量データを入れるほどメモリ消費が大きくなり、パソコンが重くなる原因になります。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方
New2
Flask
FlaskでリダイレクトやURL生成を行う方法!便利な関数の使い方を解説
New3
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New4
Flask
Flask‑Mailの使い方!アプリからメールを送信する基本方法を解説
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Django
DjangoとFlaskの違いを完全比較!初心者でもわかるPythonフレームワーク入門
No.3
Java&Spring記事人気No3
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.4
Java&Spring記事人気No4
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.5
Java&Spring記事人気No5
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説