itertools와 functools는 함수형 스타일의 데이터 처리와 성능 최적화를 돕는 표준 라이브러리입니다. 이 치트시트는 chain, islice, groupby, lru_cache 등 자주 쓰는 조합과 함정을 정리합니다.
언제 이 치트시트를 보나?
- 반복/조합/슬라이싱 로직을 “for-loop 없이” 깔끔하게 만들고 싶을 때
- 캐시로 성능을 끌어올리고 싶을 때
핵심 패턴
itertools.chain(a, b)로 시퀀스 이어붙이기- 큰 이터러블은
islice로 일부만 소비 groupby는 연속된 키만 묶음 → 보통 정렬이 먼저 필요lru_cache는 “순수 함수 + 입력이 해시 가능”일 때 가장 안전함
최소 예제
1
2
3
4
5
6
| from itertools import chain, islice
xs = chain([1, 2], [3, 4])
print(list(xs))
print(list(islice(range(100), 5))) # [0, 1, 2, 3, 4]
|
1
2
3
4
5
| from itertools import groupby
data = ["a", "a", "b", "b", "b", "a"]
for k, g in groupby(data):
print(k, list(g)) # 연속 구간 기준
|
1
2
3
4
5
6
7
8
| from functools import lru_cache, partial
@lru_cache(maxsize=1024)
def fib(n: int) -> int:
return n if n < 2 else fib(n - 1) + fib(n - 2)
pow2 = partial(pow, 2)
print(pow2(10)) # 1024
|
자주 하는 실수/주의점
groupby는 정렬된 입력이 아니면 “원하는 그룹”이 안 나올 수 있음 → 필요하면 정렬 후 사용lru_cache는 인자에 list/dict 같은 해시 불가 타입이 오면 에러- 캐시는 메모리를 사용함 → maxsize/수명 정책 고려
관련 링크(공식 문서)