Python의 functools
모듈과 lru_cache
를 활용한 고차 함수 최적화
Overview
Python의 functools
모듈은 함수형 프로그래밍 패러다임을 지원하며, 다양한 고차 함수를 제공합니다. 그 중 lru_cache
데코레이터는 함수의 성능을 최적화하는 데 도움을 줍니다. 이 데코레이터는 메모이제이션을 통해 반복적인 계산을 줄여줍니다. 이 설명에서는 functools.lru_cache
의 작동 원리와 사용 방법을 구체적으로 다루겠습니다.
functools.lru_cache
개요
lru_cache
는 "Least Recently Used"의 약자로, 최근에 사용된 함수 호출의 결과를 캐싱하여 성능을 개선합니다. 캐시된 데이터는 기본적으로 제한된 크기를 가지며, 가장 오랫동안 사용되지 않은 항목부터 삭제됩니다. 이는 계산 비용이 높은 함수에 유용하며, 함수 호출 속도를 상당히 빠르게 해줍니다.
lru_cache
의 기본 사용법
다음은 lru_cache
를 사용하는 간단한 예제입니다:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
위의 예제에서 fibonacci
함수는 피보나치 수열을 계산합니다. 이 함수에 @lru_cache
를 적용하면, 이미 계산된 피보나치 수의 결과를 캐시에 저장하고, 동일한 입력에 대해 다시 계산하지 않습니다. maxsize
매개변수는 캐시의 크기를 설정합니다. None
으로 설정하면 무제한 캐시를 의미합니다.
lru_cache
의 동작 원리
- 캐싱: 함수가 호출될 때마다 입력값과 결과가 캐시에 저장됩니다. 같은 입력값으로 호출되면 저장된 결과를 바로 반환합니다.
- LRU 알고리즘: 캐시의 크기가 설정된
maxsize
를 초과하면, 가장 오랫동안 사용되지 않은 항목이 삭제됩니다. - 메모리 관리:
maxsize
를 적절히 설정하면 메모리 사용을 최적화할 수 있습니다. 너무 큰 값은 메모리 사용을 증가시킬 수 있습니다.
사용 예제
다음 예제는 lru_cache
의 효과를 보여줍니다:
import time
from functools import lru_cache
@lru_cache(maxsize=128)
def slow_function(x):
time.sleep(2) # Simulate a slow computation
return x * 2
start_time = time.time()
print(slow_function(10)) # 첫 번째 호출은 캐시에 결과가 없으므로 시간이 걸림
print("First call took:", time.time() - start_time)
start_time = time.time()
print(slow_function(10)) # 두 번째 호출은 캐시된 결과를 사용하므로 빠름
print("Second call took:", time.time() - start_time)
위의 코드는 slow_function
을 두 번 호출하여 캐시의 효과를 보여줍니다. 첫 번째 호출은 계산이 느리지만, 두 번째 호출은 캐시된 결과를 사용하여 즉시 반환됩니다.
lru_cache
의 한계와 주의사항
- 메모리 사용: 캐시 크기가 너무 크면 메모리 사용이 증가할 수 있습니다. 적절한
maxsize
를 설정하여 메모리 사용을 관리해야 합니다. - 불변성: 캐시된 함수의 입력값은 변경 불가능한 타입이어야 합니다. 가변 객체(예: 리스트)를 입력으로 사용하면 오류가 발생할 수 있습니다.
from functools import lru_cache
@lru_cache(maxsize=10)
def example_function(a, b):
return a + b
print(example_function(1, 2)) # 정상 동작
print(example_function([1], 2)) # 오류 발생: TypeError: unhashable type: 'list'
위 코드에서 리스트를 입력값으로 사용할 경우, TypeError
가 발생합니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
Python의 pdb 모듈로 인터랙티브 디버깅하기 (1) | 2024.08.18 |
---|---|
Python의 threading 모듈로 병렬 작업 처리하기 (0) | 2024.08.18 |
Python의 asyncio를 활용한 비동기 IO 작업 이해하기 (0) | 2024.08.18 |
Python의 time 및 datetime 모듈로 시간 조작과 스케줄링 수행하기 (0) | 2024.08.18 |
Python의 socket 프로그래밍 네트워크 통신을 위한 기초 (0) | 2024.08.18 |