카테고리 없음

Python - 효과적인 코드 재작성 - functools

올엠 2025. 7. 30. 22:49
반응형

파이썬에서 코드 재작성하는 경우가 많다. 이를 더욱 효과적으로 개선해줄 수 있는 도구가 바로 functools이다.
파이썬의 functools 모듈은 표준 라이브러리에 포함된 매우 강력한 도구이다. 반복적인 코드 작성, 비슷한 함수의 재작성, 불필요한 성능 저하를 방지하고 싶다면 functools를 적극 활용해보기 바란다. 코드가 더 간결해지고, 효율적이며, 유지보수가 쉬워진다.

왜 functools를 써야 할까?
중복 코드 제거: 메모리 캐쉬, 함수 조합, 인자 고정 등 자주 쓰는 패턴을 직접 구현할 필요 없이 바로 사용할 수 있다.
성능 향상: lru_cache 같은 캐시 기능으로 연산이 많은 함수의 속도를 대폭 개선할 수 있다.
코드 재사용성 증가: 함수 조합, 인자 고정(partial) 등을 통해 더 유연하고 재사용 가능한 코드를 만들 수 있다.
데코레이터 작성이 쉬워짐: 데코레이터를 쓸 때 함수의 정보(이름, 설명 등)가 사라지는 문제를 functools가 해결해준다.

--꼭 써봐야 할 functools 기능--

lru_cache 함수 결과 캐싱 재귀, 계산량 많은 함수
partial 일부 인자 고정, 새로운 함수 생성 콜백, 반복적 인자 사용
singledispatch 타입별 함수 분기 다양한 타입 처리
wraps 데코레이터 사용 시 함수 정보 보존 커스텀 데코레이터 작성

1. lru_cache를 이용한 메모리 캐싱

함수 결과를 캐시에 저장해 반복 계산을 피할 수 있다. 특히 재귀 함수나 계산량이 많은 함수에 효과적이다.

이렇게 하면 느린 재귀 함수도 빠르게 동작한다.

from functools import lru_cache

@lru_cache(maxsize=128)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

 

2. partial로 인자 고정

자주 사용하는 인자를 미리 고정시켜 새로운 함수를 만들 수 있다. 콜백이나 반복적으로 비슷한 인자를 쓸 때 유용하다.

비슷한 함수 여러 개를 만들 필요 없이, 코드 중복이 줄여준다.

from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)
print(square(5))  # 출력: 25

3. singledispatch로 타입별 함수 분기

첫 번째 인자의 타입에 따라 함수 동작을 다르게 할 수 있다. 복잡한 if-else문을 깔끔하게 대체한다.
확장성과 가독성이 뛰어나다.

from functools import singledispatch

@singledispatch
def process(data):
    raise NotImplementedError

@process.register
def _(data: dict):
    print("딕셔너리 처리")

@process.register
def _(data: list):
    print("리스트 처리")

4. wraps로 데코레이터 정보 보존

데코레이터를 쓰면 원래 함수의 이름, 설명 등이 사라질 수 있는데, wraps를 쓰면 이 정보를 그대로 보존할 수 있다.

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 추가 동작
        return func(*args, **kwargs)
    return wrapper


파이썬에서 반복적으로 비슷한 코드를 작성하고 있다면, 이제는 functools를 활용보기를 추천한다. 코드가 더 짧아지고, 성능도 좋아지며, 유지보수도 쉬워진다.

반응형