lru_cache
(Least Recently Used cache) — это декоратор из модуля functools
, который реализует мемоизацию (memoization) функций, сохраняя результаты вызовов для избежания повторных вычислений.
Декоратор запоминает возвращаемые значения функции для определенных аргументов:
from functools import lru_cache
@lru_cache
def fibonacci(n: int) -> int:
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
Без кэширования сложность O(2ⁿ), с кэшем — O(n).
maxsize
: максимальное количество хранимых результатов (по умолчанию 128)typed
: раздельное кэширование для разных типов (False по умолчанию)@lru_cache(maxsize=256, typed=True)
def calculate(x: float, y: float) -> float:
return x**2 + y**2
import requests
@lru_cache(maxsize=100)
def get_user_data(user_id: int):
response = requests.get(f"https://api.example.com/users/{user_id}")
return response.json()
@lru_cache
def parse_config(file_path: str) -> dict:
with open(file_path) as f:
return json.load(f)
Аргументы должны быть хешируемыми (hashable). Для нехешируемых аргументов можно использовать преобразование:
@lru_cache
def process_data(data_tuple: tuple):
# data_tuple - неизменяемая версия данных
pass
fibonacci.cache_clear() # Полная очистка кэша
cache_info = fibonacci.cache_info()
print(f"Hit: {cache_info.hits}, Miss: {cache_info.misses}")
functools.cache
: неограниченный кэш (Python 3.9+)cachetools
: более продвинутые варианты кэшированияlru_cache
идеально подходит для:
Пример с подсветкой (VSCode style):
from functools import lru_cache
@lru_cache(maxsize=32)
def get_weather(city: str, country: str) -> dict:
# Имитация запроса к API погоды
print(f"Fetching weather for {city}, {country}")
return {
"city": city,
"country": country,
"temperature": 25.5 # Пример данных
}