🔍 파이썬 itertools 모듈 고급 활용 및 실전 사례
itertools는 반복자 도구 모음으로, 데이터 처리, 알고리즘, 조합 생성 등 다양한 상황에서 성능 좋고 간결한 코드 작성을 돕습니다. 단순 소개를 넘어 실무에서 활용할 수 있는 고급 팁을 포함했습니다.
1. `product()` – 고려해야 할 경우의 수 생성
import itertools
colors = ['red', 'green', 'blue']
sizes = ['S','M','L']
quantities = [1,2]
for c, s, q in itertools.product(colors, sizes, quantities):
print(f"{c}-{s}: {q}개")
- ✏️ 실제 재고 시스템에서는 variant data 생성에 유용.
💡 단, **곱셈 급증**에 주의하세요. (3×3×2=18개 생성)
2. `combinations`, `permutations` + `max_length` 필터링
import itertools
items = ['A','B','C','D']
# 3개 조합
for combo in itertools.combinations(items, 3):
print(combo)
# 길이 2 순열 + 조건 필터링
for perm in itertools.permutations(items, 2):
if perm[0] < perm[1]:
print(perm)
- 조건 필터링은 순열 생성 비용이 커질 수 있으므로, **읽기/추론 전 필터링 구조 설계** 권장.
3. `accumulate()` + 누적 통계 구현
import itertools, operator
data = [3, 1, 4, 1, 5, 9]
sum_seq = list(itertools.accumulate(data))
prod_seq = list(itertools.accumulate(data, operator.mul))
print("누적 합:", sum_seq)
print("누적 곱:", prod_seq)
- 📊 실무에서 moving average 구현에 쉽게 응용 가능.
- 연속 점수 누적 합, 재고 잔량 계산 등에 유용.
4. `groupby()` + 정렬이 중요한 이유
import itertools
records = [
{'age': 30, 'name':'Alice'},
{'age': 25, 'name':'Bob'},
{'age': 30, 'name':'Charlie'},
]
records.sort(key=lambda x: x['age'])
for age, group in itertools.groupby(records, key=lambda x: x['age']):
names = [r['name'] for r in group]
print(age, names)
- ⚠️ 꼭 **정렬된 시퀀스에서만** 예상된 그룹화 결과.
5. `tee()` + 병렬 흐름 처리
import itertools
data = range(1, 5)
it1, it2 = itertools.tee(data, 2)
print(list(it1))
print(list(it2))
- ⚙️ 데이터 스트림을 병렬로 분기해 다양한 분석에 활용 가능.
- 메모리 복제 비용 주의 – 적은 요소에서만 사용 권장.
6. 성능 비교 – 직접 vs itertools
import timeit, itertools
setup = "data = list(range(1000))"
t1 = timeit.timeit("sum(x*x for x in data)", setup=setup, number=1000)
t2 = timeit.timeit("sum(itertools.accumulate(data, lambda a,b: a+b*b))",
setup=setup + "\nimport itertools", number=1000)
print(t1, t2)
- 🧪 `itertools`는 **지연 평가(lazy evaluation)** 특성 덕분에 큰 데이터에서 유리할 수 있습니다.
✨ 요약 & 활용 팁
- product(): 다중 조합 생성 시 유용하지만 결과 수 폭발 주의
- combinations/permutations: 필터링과 함께 사용하면 성능 최적화 가능
- accumulate(): 누적 통계, 이동 평균 등에 직관적 구현
- groupby(): 정렬 후 그룹화, 데이터 요약에 필수
- tee(): 반복자 복제 시 편리하지만 메모리 비용 확인 필요
- 성능 테스트를 통해 **itertools와 일반 comprehension** 비교해보세요
댓글
댓글 쓰기