[모던 Python 9편] functools, itertools로 선언적 데이터 처리하기

파이썬은 예전부터 간단한 리스트 컴프리헨션, 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 문법, 라이브러리, 도구를 종합 정리하고, 추가 학습 자료 및 앞으로 나아갈 방향에 대해 제안하겠습니다.

반응형