functools.lru_cache() și functools.cache() în Python

Modulul functools Python 3.2+ (cache: 3.9+)

Memorează rezultatele unei funcții, ca apelurile repetate cu aceleași argumente să fie instantanee.

Sintaxă
@functools.lru_cache(maxsize=128, typed=False)
@functools.cache

Ce face functools.lru_cache() și functools.cache()

Decoratorul @lru_cache păstrează rezultatele ultimelor maxsize apeluri diferite. Când funcția este apelată din nou cu aceleași argumente, rezultatul vine din memorie, fără să mai fie calculat. „LRU” înseamnă că, la umplere, se șterge rezultatul folosit cel mai demult.

@cache (Python 3.9+) este echivalent cu lru_cache(maxsize=None): fără limită. Funcția decorată primește metodele cache_info() (statistici) și cache_clear(). Argumentele trebuie să aibă hash (fără liste sau dicționare).

Parametri

Parametru Descriere
maxsize Numărul maxim de rezultate păstrate; None = fără limită.
typed Dacă este True, f(3) și f(3.0) sunt memorate separat.

Ce returnează

Funcția decorată, cu cache.

Exemple

Exemplul 1: Fibonacci rapid

from functools import cache, lru_cache

@cache
def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)

print(fib(100))
print(fib.cache_info())

@lru_cache(maxsize=2)
def patrat(x):
    print("  calculez", x)
    return x * x

for x in [2, 3, 2, 4, 2]:
    print(patrat(x))
print(patrat.cache_info())

Rezultat

354224848179261915075
CacheInfo(hits=98, misses=101, maxsize=None, currsize=101)
  calculez 2
4
  calculez 3
9
4
  calculez 4
16
4
CacheInfo(hits=2, misses=3, maxsize=2, currsize=2)

Greșeli frecvente

  • Pui cache pe o funcție care depinde de timp, de fișiere sau de date care se schimbă. Rezultatul memorat devine învechit.
  • Apelezi funcția cu o listă: TypeError: unhashable type: 'list'. Transmite un tuplu.

Comenzi înrudite