Sobes.tech

Python

# Napíšte kód pre funkcie cache. Je to dekorátor, ktorý by # si mal pamätať, čo vrátila dekorovaná funkcia, a vrátiť uloženú # hodnotu pri opakovanom volaní s rovnakými argumentmi. # Predpokladajte, že všetky argumenty sú hashovateľné. # Používajte iba štandardnú knižnicu Pythonu.

140

Prečo zoradiť kwargs pri vytváraní kľúča cache memoization?

131

Je potrebné použiť OrderedDict namiesto bežného dict pre memoization cache bez limitu veľkosti a politiky vymazávania?

117

Aké obmedzenia a problémy má in-memory cache, najmä pri škálovaní mikroservisov na niekoľko pracovníkov?

111

# Napíšte kód pre funkciu cache. Ide o dekorátor, ktorý by mal # pamätať, čo vrátila dekorovaná funkcia, a pri opakovanom volaní s rovnakými # argumentmi vrátiť zapamätanú hodnotu. # # Predpokladá sa, že všetky argumenty sú hashovateľné. # Používajte iba štandardnú knižnicu Pythonu. def cache(func): raise NotImplementedError calls = {"count": 0} @cache def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert add(2, 3) == 5 assert calls["count"] == 2 print("OK")

106

# Napíšte kód pre funkciu cache. Je to dekorátor, ktorý by si mal pamätať, # čo vrátila dekorovaná funkcia, a pri opakovanom volaní s rovnakými argumentmi # vrátiť uloženú hodnotu. # Predpokladá sa, že všetky argumenty sú hashovateľné. # Používajte iba štandardnú knižnicu Pythonu. def cache(backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (args, tuple(sorted(kwargs.items()))) result = backend.get(key) if result is not None: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper return decorator calls = {"count": 0} backend = {} @cache(backend=backend) def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")

104

# Napišite kód pre funkcie cache. Je to dekorátor, ktorý by # si mal pamätať, čo vrátila dekorovaná funkcia, a pri opakovanom # volaní s rovnakými argumentmi vrátiť uloženú hodnotu. # # Môže sa predpokladať, že všetky argumenty sú hashovateľné. # Používajte iba štandardnú knižnicu Pythonu.

98

Ako se izognete kolizijam v predpomnilniku med različnimi funkcijami, ki se kličejo z enakimi argumenti, na primer add(2, 3) in multiply(2, 3)?

98

# # Môžeme predpokladať, že všetky argumenty sú hashovateľné. # Používajte iba štandardnú knižnicu Python. _SANTINEL = object() def cache(func=None, backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (func.__qualname__, args, tuple(sorted(kwargs.items()))) result = backend.get(key, _SANTINEL) if result is _SANTINEL: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper if func is None: return decorator return decorator(func) calls = {"count": 0} backend = {} @cache def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")

93

# Môžeme predpokladať, že všetky argumenty sú hashovateľné. # Použite iba štandardnú knižnicu Pythonu. _SANTINEL = object() def cache(backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): key = (args, tuple(sorted(kwargs.items()))) result = backend.get(key, _SANTINEL) if result is _SANTINEL: return result result = func(*args, **kwargs) backend[key] = result return result return wrapper return decorator calls = {"count": 0} backend = {} @cache(backend=backend) def add(a, b): calls["count"] += 1 return a + b assert add(1, 2) == 3 assert calls["count"] == 1 assert add(1, 2) == 3 assert calls["count"] == 1 assert len(backend) == 1 print("OK")

93