파이썬은 예전부터 간단한 리스트 컴프리헨션, map()
, filter()
함수로 함수형 프로그래밍(FP) 스타일을 지원했습니다. 하지만 복잡한 데이터 처리 로직을 구현할 때는 여전히 for 루프가 길어지거나, 중간 중간 임시 변수를 많이 선언하는 경우가 발생할 수 있었습니다.
functools, itertools 모듈은 이러한 문제를 해결하기 위한 고급 함수형 툴셋을 제공하여, 데이터 변환, 그룹화, 누적 연산 등을 더 직관적이고 Pythonic하게 처리할 수 있게 합니다.
이번 글에서는 기존 방식과 새로운 함수형 접근법의 비교, 주요 함수 및 장단점을 살펴봅니다.
이전에는 어떻게 했을까?
전통적 for 루프 기반 처리
data = [1, 2, 3, 4, 5]
# 짝수만 제곱해서 합산하기
result = 0
for x in data:
if x % 2 == 0:
result += x*x
- 단점: 로직이 길어질수록 for 루프 내 조건문, 누적 변수 증가로 가독성 ↓
- 기능 추가 시 for 루프 수정 필요, 추상화 어려움
functools, itertools를 활용한 현대적 접근
functools.reduce
reduce()
함수는 누적 연산을 간결히 표현합니다.
from functools import reduce
from operator import add
data = [1, 2, 3, 4, 5]
result = reduce(add, (x*x for x in data if x % 2 == 0))
여기서 (x*x for x in data if x % 2 == 0)
는 제너레이터 표현식으로 짝수의 제곱만 생성하고, reduce(add, ...)
로 이들을 합산합니다.
장점:
- 로직이 함수형 스타일로 축약, 명확한 의도 표현
- 간단한 누적 연산 시 for 루프보다 간결
단점:
- reduce 사용에 익숙하지 않으면 첫 시선에서 의미 파악 어려울 수 있음
- 너무 복잡한 로직을 reduce로 표현하면 오히려 난해
itertools: 반복자(Iterator) 처리 고급함수
itertools
는 반복자 처리에 유용한 함수들을 모아둔 모듈로, 그룹화, 조합, 차집합 등 다양 기능 지원.
예: groupby
로 데이터 그룹화
from itertools import groupby
data = [('apple', 'fruit'), ('banana', 'fruit'), ('carrot', 'vegetable'), ('spinach', 'vegetable')]
for key, group in groupby(data, key=lambda x: x[1]):
print(key, list(group))
결과:
fruit [('apple', 'fruit'), ('banana', 'fruit')]
vegetable [('carrot', 'vegetable'), ('spinach', 'vegetable')]
장점:
- 복잡한 데이터 변환, 필터링, 그룹화를 단일 함수 호출로 처리 가능
- 중간 결과 임시 리스트나 변수 없이 흐름형 처리 가능
단점:
- 함수, 람다 활용한 선언적 스타일에 익숙해질 필요
- 너무 복잡한 로직을 itertools 체인으로 표현하면 난해해질 수 있으니 적절한 균형 필요
성능 및 코드 품질 측면
함수형 툴 사용 시 성능이 획기적으로 개선되지는 않지만, 제너레이터나 이터레이터 기반 처리로 메모리 사용을 줄일 수 있고, 특정 경우에서 파이썬 내부 최적화를 통한 성능 이득도 있을 수 있습니다. 주된 목적은 코드 가독성과 유지보수성 개선이므로, 성능보다는 코드 품질 측면에서 장점이 더 큽니다.
결론
- 예전 방식: for 루프와 중간 변수로 데이터 처리 로직 구현, 코드 길어지고 유지보수 어려움
- 새로운 방식: functools.reduce, itertools.groupby, chain 등 함수형 툴로 선언적이고 간결한 데이터 파이프라인 구축
- 장점: 가독성↑, 유지보수성↑, 코드 로직 의도가 분명해짐
- 단점: 함수형 패러다임에 익숙해질 필요, 복잡한 로직은 오히려 난해해질 수 있음
다음 글에서는 이 시리즈를 마무리하면서, 지금까지 다룬 모던 Python 문법, 라이브러리, 도구를 종합 정리하고, 추가 학습 자료 및 앞으로 나아갈 방향에 대해 제안하겠습니다.
'개발 이야기 > Python (파이썬)' 카테고리의 다른 글
[pyproject.toml 완전 정복 1편] pyproject.toml 등장 배경 및 기본 구조 (0) | 2024.12.17 |
---|---|
[모던 Python 10편] 시리즈 마무리 및 추가 학습 방향 (0) | 2024.12.17 |
[모던 Python 8편] Context Manager와 with문으로 자원 자동 정리하기 (0) | 2024.12.17 |
[모던 Python 7편] 패턴 매칭(Pattern Matching)으로 조건문 단순화하기 (0) | 2024.12.17 |
[모던 Python 6편] pyproject.toml와 Poetry로 패키징 현대화하기 (0) | 2024.12.17 |