Pythonの「itertools」で、繰り返し処理をもっとスマートに!効率的なイテレータ活用術

投稿者: | 2026-01-29

皆さん、こんにちは!プログラミング学習、楽しんでいますか?今回は、Pythonの標準ライブラリの中でも、特に「かゆいところに手が届く」存在である`itertools`についてご紹介します。リストやシーケンスを扱う際、「もっと効率的に処理できないかな?」と感じたことはありませんか?そんな時に、`itertools`がきっと皆さんの強力な味方になってくれますよ!

普段のコードがぐっと洗練される、とても便利なモジュールなんです!

概要

`itertools`は、効率的なループ処理を実現するための多様なイテレータを作成・操作する関数群を提供するモジュールです。Pythonの組み込み関数`map()`や`filter()`のように、イテレータを返却するため、メモリを節約しながら大規模なデータ処理を行うのに適しています。無限イテレータ、組み合わせイテレータ、要素を結合するイテレータなど、様々な目的に応じた機能が揃っています。

メリット

`itertools`を利用する主なメリットは以下の3点です。

  1. メモリ効率の向上: `itertools`の関数は結果を一度に全て生成するのではなく、必要に応じて要素を一つずつ生成する「イテレータ」を返します。これにより、特に大きなデータセットを扱う際にメモリ使用量を大幅に削減できます。
  2. コードの簡潔化: 複雑なループ処理やリスト内包表記を、より簡潔で読みやすいコードで記述できるようになります。特定のパターン(順列、組み合わせなど)の生成が、専用の関数を使うことで非常に簡単になります。
  3. 高いパフォーマンス: C言語で実装されているため、Pythonの純粋なループよりも高速に動作することが期待できます。大量のデータを扱う際に、処理時間の短縮に貢献します。

サンプルコード

それでは、いくつか代表的な`itertools`の関数を見てみましょう。

どれも実用的な機能ばかりで、知っているとコーディングの幅が広がりますよ!

import itertools

# 1. count: 無限に連番を生成 (引数で開始値とステップを指定可能)
print("--- itertools.count ---")
for i in itertools.count(start=10, step=2):
    if i > 20:
        break
    print(i)
# 出力: 10, 12, 14, 16, 18, 20

# 2. cycle: 要素を無限に繰り返す
print("\n--- itertools.cycle ---")
count = 0
for item in itertools.cycle(['A', 'B', 'C']):
    print(item)
    count += 1
    if count >= 7:
        break
# 出力: A, B, C, A, B, C, A

# 3. repeat: 要素をn回繰り返す
print("\n--- itertools.repeat ---")
for item in itertools.repeat('Hello', 3):
    print(item)
# 出力: Hello, Hello, Hello

# 4. permutations: 順列を生成
print("\n--- itertools.permutations ---")
for p in itertools.permutations('ABC', 2):
    print(''.join(p))
# 出力: AB, AC, BA, BC, CA, CB

# 5. combinations: 組み合わせを生成 (順序は考慮しない)
print("\n--- itertools.combinations ---")
for c in itertools.combinations('ABC', 2):
    print(''.join(c))
# 出力: AB, AC, BC

# 6. product: 直積 (デカルト積) を生成
print("\n--- itertools.product ---")
for p in itertools.product('AB', 'CD'):
    print(''.join(p))
# 出力: AC, AD, BC, BD

みーちゃんのワンポイント

`itertools`の関数が返すのは「イテレータ」であるため、一度使い切ると中身は空になります。繰り返し使いたい場合は、その都度関数を呼び出し直すか、`list()`などで明示的にリスト化して保存してくださいね。また、無限イテレータは`break`などで適切に停止させないと、無限ループになるので注意が必要です。