콘텐츠로 건너뛰기

파이썬에서 LRU 캐시 사용하는 법

[

Python에서 lru_cache 사용하기

Python 튜토리얼 시리즈에서는 Python의 lru_cache에 대해 자세히 살펴보겠습니다. 이 튜토리얼은 상세한 실행 가능한 단계별 예제 코드와 설명을 제공하여 정보를 전달하는 데 목적이 있습니다.

Python Tutorials

Python Tutorials는 깊이있는 기사와 영상 코스를 제공합니다. Learning Paths → 가이드 학습 계획을 통해 가속화된 학습을 할 수 있습니다. Quizzes → 학습 진행 상황을 확인할 수 있습니다. Browse Topics → 특정 영역이나 기술 수준에 초점을 맞출 수 있습니다. Community Chat → 다른 Python 개발자들과 함께 학습할 수 있습니다. Office Hours → Python 전문가와 실시간 질의응답 콜을 할 수 있습니다. Podcast → Python의 새로운 소식을 들을 수 있습니다. Books → 지식을 보완하고 오프라인에서 학습할 수 있습니다. Unlock All Content →

더 많은 컨텐츠

Learner Stories Python Newsletter Python Job Board 파이썬 Meet the Team 우리 팀을 만나보세요 Tutorial Writer로 지원하기 튜토리얼 작성자로 지원하기 Video Instructor로 지원하기 비디오 강사로 지원하기

찾기

Search / 찾기

Join 가입 Sign‑In 로그인

— 무료 이메일 시리즈 —

Python Tricks

Python Tricks Dictionary Merge

Python Tricks 받기 »

🔒 스팸 없음. 언제든지 구독을 취소할 수 있습니다.

태그 검색하기 가이드 학습 계획
기초 중급 고급


api best-practices career community databases data-science data-structures data-viz devops django docker editors flask front-end gamedev gui machine- learning numpy projects python testing tools web- dev web-scraping

캐싱과 그 사용

**캐싱(Caching)**은 작업이 빠르고 응답성 있는 애플리케이션을 구현하기 위한 최적화 기술입니다. 캐싱 기법을 올바르게 사용하면 작업이 더 빨라지고 컴퓨팅 리소스의 부하를 줄일 수 있습니다. Python의 functools 모듈에는 @lru_cache 데코레이터가 있습니다. @lru_cache 데코레이터를 사용하면 Least Recently Used (LRU) 전략을 사용하여 함수의 결과를 캐시할 수 있습니다. 이 강력한 기술을 사용하여 캐싱의 힘을 활용하는 방법을 배워보겠습니다.

이 튜토리얼에서는 다음을 배울 것입니다.

  • 어떤 캐싱 전략이 사용 가능한지 알아보고 Python 데코레이터를 사용하여 구현하는 방법
  • LRU 전략이 무엇이고 어떻게 작동하는지
  • @lru_cache 데코레이터를 사용하여 성능을 향상시키는 방법
  • 특정 시간이 지난 후 캐시를 만료시키기 위해 @lru_cache 데코레이터의 기능을 확장하는 방법

이 튜토리얼을 마치면 캐싱이 어떻게 작동하며 Python에서 어떻게 활용할 수 있는지에 대한 깊은 이해를 갖게 됩니다.

캐싱과 그 사용

캐싱은 애플리케이션에서 최근이거나 자주 사용되는 데이터를 복사하는 최적화 기술입니다. 이 복사본은 소스에 비해 더 빠르거나 계산 비용이 적은 메모리 위치에 저장됩니다.

예를 들어 다양한 소스에서 최신 뉴스를 가져와 사용자에게 제공하는 뉴스리더 애플리케이션을 개발한다고 가정해 봅시다. 사용자가 목록을 탐색하는 동안 애플리케이션이 기사를 다운로드하고 화면에 표시합니다.

사용자가 몇 개의 뉴스 기사 사이를 반복적으로 이동하기로 결정하면 어떻게 될까요? 데이터를 캐시하지 않았다면 애플리케이션은 매번 같은 내용을 다시 다운로드해야 합니다! 이는 사용자의 시스템을 둔감하게 만들고 기사를 호스팅하는 서버에 부하를 줄 것입니다.

더 나은 접근 방식은 각 기사를 가져온 후, 내부적으로 데이터를 로컬에 저장하는 것입니다. 그런 다음 사용자가 다시 기사를 열기로 결정할 때, 애플리케이션은 로컬에 저장된 복사본을 불러오며 소스로 되돌아가지 않습니다. 이 기법을 컴퓨터 과학에서는 캐싱이라고 합니다.

Remove ads

Python 딕셔너리를 사용하여 캐시 구현하기

파이썬에서는

뉴스리더 예제를 계속 사용하겠습니다. 기사를 다운로드해야 할 때마다 서버에 직접 접속하는 대신 캐시에 해당 콘텐츠가 있는지 확인하고, 없으면 서버로 이동할 수 있습니다. 기사의 주소를 키로 사용하고, 기사 내용을 값으로 사용하여 딕셔너리에 데이터를 저장할 수 있습니다. 이렇게 하면 기사 내용을 캐시로 저장하여 복제본에서 기사 내용을 검색할 수 있습니다.

cache = {}
def fetch_article(article_url):
if article_url in cache:
return cache[article_url]
else:
# 데이터 가져오는 로직
data = ...
cache[article_url] = data
return data

이렇게 캐싱을 구현함으로써 기존 방식에 비해 애플리케이션의 응답성을 대폭 향상시킬 수 있습니다. 그리고 더 이상 같은 내용을 반복해서 다운로드할 필요가 없습니다.

@lru_cache를 사용하여 Python에서 LRU 캐시 구현하기

Python에서는 functools 모듈이 제공됩니다. 이 모듈에는 @lru_cache 데코레이터가 포함되어 있어 함수 결과를 캐시할 수 있습니다. LRU(Least Recently Used) 전략을 사용합니다. 이는 캐시의 성능을 향상시키는 간단하면서도 강력한 기술입니다.

@lru_cache 데코레이터를 사용하여 쉽게 LRU 캐시를 구현할 수 있습니다. functools 모듈을 임포트하고 데코레이터를 함수에 추가하기만 하면 됩니다.

from functools import lru_cache
@lru_cache(maxsize=256)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)

위의 예제에서 fibonacci 함수는 입력 파라미터 n에 따른 피보나치 수를 계산합니다. lru_cache 데코레이터를 사용하여 함수 결과를 자동으로 캐시하도록 설정했습니다. 이제 함수가 동일한 파라미터로 여러 번 호출되어도 중복된 계산이 발생하지 않고 캐시된 결과를 사용합니다.

지금까지의 예제에서 fibonacci(4)를 호출하는 경우 계산이 중복되지 않고 한 번만 수행됩니다. 그리고 나서 fibonacci(3)fibonacci(2)를 호출할 때 캐시된 값을 사용하여 계산을 수행합니다. 이를 통해 피보나치 수열을 계산할 때 사용되는 계산 비용을 크게 줄일 수 있습니다.

캐시 만료 추가하기

캐시는 항상 새로운 데이터를 반영하지 않을 수 있습니다. 예를 들어, 기사의 내용이 변경되면 캐시된 값은 여전히 이전 데이터를 나타낼 수 있습니다. 이런 상황에서는 캐시를 주기적으로 만료시키고 최신 데이터를 가져와야 합니다.

캐시 항목을 시간 및 공간 기준으로 만료시키는 방법을 살펴보겠습니다.

캐시 만료를 시간 기준으로 추가하는 방법은 간단합니다. datetime 모듈을 사용하여 기사의 마지막 갱신일을 저장하고 expiration_time 변수를 사용하여 캐시가 만료되는 시간을 설정합니다. 매번 캐시를 가져오기 위해 캐시된 데이터의 생성 시간을 확인하고 만료 여부를 확인할 수 있습니다.

from datetime import datetime, timedelta
cache = {}
expiration_time = timedelta(minutes=10)
def fetch_article(article_url):
if article_url in cache:
cached_data, cached_time = cache[article_url]
if datetime.now() - cached_time < expiration_time:
return cached_data
# 데이터 다운로드
data = ...
cache[article_url] = (data, datetime.now())
return data

이제 캐시에 저장된 데이터가 만료되면 캐시에 새로운 데이터를 가져옵니다. datetime.now() - cached_time < expiration_time을 사용하여 데이터가 만료되었는지 확인합니다.

결론

이 튜토리얼에서는 캐싱이 무엇이고 Python에서 어떻게 적용할 수 있는지 자세히 알아보았습니다. lru_cache를 사용하여 캐시 메커니즘을 구현해 보았고, 더 나아가 캐시 만료 기능을 추가하는 방법을 살펴보았습니다. 캐시를 활용하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다. Python에서 캐싱을 적용하는 방법을 익혀보세요.