본문 바로가기

Study Information Technology

Python의 functools 모듈과 lrucache를 활용한 고차 함수 최적화

728x90
반응형

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의 동작 원리

  1. 캐싱: 함수가 호출될 때마다 입력값과 결과가 캐시에 저장됩니다. 같은 입력값으로 호출되면 저장된 결과를 바로 반환합니다.
  2. LRU 알고리즘: 캐시의 크기가 설정된 maxsize를 초과하면, 가장 오랫동안 사용되지 않은 항목이 삭제됩니다.
  3. 메모리 관리: 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가 발생합니다.

참고문서

728x90
반응형