콘텐츠로 건너뛰기

파이썬 캐시 활용 방법 완전히 설명하기

[

Python 캐시를 이용한 캐싱(Caching) 튜토리얼

캐싱은 애플리케이션의 응답 속도를 향상시키는 최적화 기법 중 하나입니다. 제대로 사용한다면, 캐싱은 코드의 실행 속도를 빠르게 할 뿐만 아니라 컴퓨팅 리소스의 부하를 줄일 수도 있습니다. 파이썬의 functools 모듈에는 @lru_cache 데코레이터를 제공하는데, 이 데코레이터를 사용하면 함수의 결과를 캐시에 저장할 수 있습니다. 이때 사용되는 전략은 “최근에 가장 오래 사용되지 않은” (Least Recently Used, LRU) 전략입니다. 이 강력한 캐싱 방법을 사용하여 코드에서 캐싱의 효과를 극대화할 수 있습니다.

이 튜토리얼에서는 다음과 같은 내용을 배울 수 있습니다:

  • 사용 가능한 캐싱 전략파이썬 데코레이터를 사용하여 전략을 구현하는 방법
  • LRU(Least Recently Used) 전략이 무엇인지와 어떻게 작동하는지
  • @lru_cache 데코레이터를 사용하여 성능을 높이는 방법
  • 특정 시간 후에 캐시가 만료되도록 @lru_cache 데코레이터의 기능을 확장하는 방법

이 튜토리얼을 마치면 캐싱의 작동 방식에 대해 더 깊게 이해하고 파이썬에서 캐싱을 활용하는 방법을 습득할 수 있을 것입니다.

캐싱과 그 사용 예시

캐싱은 애플리케이션에서 최근 또는 자주 사용되는 데이터를 소스보다 액세스하기 더 빠르거나 연산 비용이 적은 메모리에 보관할 수 있는 최적화 기법입니다.

뉴스 패널 애플리케이션을 개발한다고 가정해봅시다. 이 애플리케이션은 다양한 소스에서 최신 뉴스를 가져옵니다. 사용자가 목록을 탐색하면서 기사를 다운로드하여 화면에 표시하는 방식입니다.

사용자가 목록 사이를 왔다갔다하면서 몇 개의 뉴스 기사를 반복적으로 열람한다고 가정해봅시다. 데이터를 캐시하지 않은 경우에는 매번 동일한 콘텐츠를 가져와야 합니다! 이는 사용자의 시스템을 느리게 만들고 기사를 호스팅하는 서버에 더 많은 부하를 가중시킬 것입니다.

더 나은 방법은 각 기사를 가져온 후 로컬에 콘텐츠를 저장하는 것입니다. 사용자가 기사를 열기로 결정할 때 다음 번에는 로컬 저장된 사본에서 콘텐츠를 열람할 수 있습니다. 이러한 기법을 캐싱(Caching)이라고 합니다.

파이썬 사전(Dictionary)을 사용한 캐시 구현

파이썬에서는 캐싱 솔루션을 구현하기 위해 사전(Dictionary)을 사용할 수 있습니다.

뉴스 패널 예시를 계속 사용해보겠습니다. 기사를 다운로드해야 할 때마다 서버로 직접 이동하는 대신, 캐시에 콘텐츠가 있는지 확인한 후, 캐시에 없는 경우에만 서버로 이동할 수 있습니다. 파이썬에서는 다음과 같은 구조를 사용할 수 있습니다:

cache = {}
def fetch_article(article_id):
if article_id in cache:
return cache[article_id]
# 서버에서 기사를 가져오는 코드
article = get_article_from_server(article_id)
cache[article_id] = article
return article

이 예제에서 cache는 캐시에 사용되는 사전(Dictionary)입니다. fetch_article 함수는 이 사전을 캐시로 사용하여 기사를 가져옵니다. 이 함수는 우선 캐시에서 기사를 찾아보고, 캐시에 있다면 즉시 반환합니다. 그렇지 않은 경우에는 서버에서 기사를 가져와 캐시에 저장하고 반환합니다.

이와 같은 방식으로 데이터를 가져오면 사용자가 같은 기사를 여러 번 요청해도 기사를 다운로드하는 데 필요한 작업이 감소하게 됩니다. 이는 속도 향상과 리소스 사용 감소에 도움이 됩니다.

@lru_cache를 사용하여 캐시를 구현하는 방법

이제 파이썬의 functools 모듈 내의 @lru_cache 데코레이터를 사용하여 캐시를 구현하는 방법에 대해 알아보겠습니다.

아래의 예제는 재귀 함수를 사용하여 계단 오르기 문제를 해결하는 코드입니다. 이 문제는 n개의 계단이 있을 때, 한 번에 1개 또는 2개의 계단을 오르는 방법의 경우의 수를 구하는 것입니다. 이 문제를 재귀 함수로 풀면 중복되는 계산이 발생하여 실행 시간이 오래 걸립니다.

def count_ways(n):
if n <= 1:
return 1
return count_ways(n-1) + count_ways(n-2)
print(count_ways(10))

이 방법은 작은 n에서는 잘 작동하지만, n 값이 커질수록 성능이 떨어지는 것을 알 수 있습니다. 이 문제를 해결하기 위해 @lru_cache 데코레이터를 사용하면 됩니다.

import functools
@functools.lru_cache()
def count_ways(n):
if n <= 1:
return 1
return count_ways(n-1) + count_ways(n-2)
print(count_ways(10))

@lru_cache 데코레이터를 함수 위에 추가하면 함수의 결과가 캐시에 저장되고, 이후 같은 인수로 함수를 호출할 때는 캐시에서 결과를 반환합니다. 이를 통해 중복 계산을 피하고 실행 시간을 크게 단축시킬 수 있습니다.

캐시 만료 기능 추가하기

캐시에 만료 기능을 추가하면 일정 기간이 지나면 캐시 항목이 자동으로 제거됩니다. 이를 통해 오래된 데이터를 유지하지 않고 최신 정보를 유지할 수 있습니다.

만료 시간 기능을 추가하려면 cache 모듈의 ttl_cache 데코레이터를 사용하면 됩니다.

import cache
@cache.ttl_cache(ttl=60) # 1분 만료 시간 설정
def fetch_article(article_id):
return get_article_from_server(article_id)

위의 예제에서 @cache.ttl_cache(ttl=60) 데코레이터는 60초(1분) 동안 캐시가 유지되도록 설정합니다. 만료 시간이 경과하면 해당 항목은 자동으로 캐시에서 제거됩니다.

이를 통해 캐싱된 데이터가 오래되지 않고 항상 최신 정보만 유지되도록 할 수 있습니다.

결론

파이썬에서 캐싱을 사용하여 코드의 성능을 개선할 수 있습니다. @lru_cache 데코레이터를 사용하면 함수의 결과를 캐시에 저장하여 중복 계산을 피하고 실행 시간을 크게 단축시킬 수 있습니다. 또한 cache 모듈의 ttl_cache 데코레이터를 사용하여 캐시된 데이터를 일정 시간 동안만 유지하도록 할 수 있습니다.

이 튜토리얼을 마친 다음에는 캐싱이 작동하는 방식을 더 깊게 이해하고 프로젝트에 적용할 수 있는 능력을 향상시킬 수 있을 것입니다.