Sobes.tech

Python

# Napište kód pro funkci cache. Je to dekorátor, který by # si měl pamatovat, co vrátila dekorovaná funkce, a vracet uloženou # hodnotu při opakovaném volání se stejnými argumenty. # Předpokládejte, že všechny argumenty jsou hashovatelné. # Používejte pouze standardní knihovnu Pythonu.

140

Proč třídit kwargs při vytváření klíče memoizační mezipaměti?

131

Je třeba použít OrderedDict místo běžného dict pro memoizační cache bez omezení velikosti a politiky vyřazování?

117

Jaká jsou omezení a problémy in-memory cache, zejména při škálování mikroservis na několik pracovníků?

111

# Napište kód pro funkci cache. Je to dekorátor, který by měl # pamatovat, co vrátila dekorovaná funkce, a vracet uloženou # hodnotu při opakovaném volání se stejnými argumenty. # # Může se předpokládat, že všechny argumenty jsou hashovatelné. # Používejte pouze standardní knihovnu 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")

105

# Napište kód pro funkci cache. Je to dekorátor, který by si měl pamatovat, # co vrátila dekorovaná funkce, a při opakovaném volání se stejnými argumenty # vrátit uloženou hodnotu. # Předpokládejte, že všechny argumenty jsou hashovatelné. # Používejte pouze standardní knihovnu 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šte kód pro funkci cache. Je to dekorátor, který by # si měl pamatovat, co vrátila dekorovaná funkce, a vracet uloženou # hodnotu při opakovaném volání se stejnými argumenty. # # Může se předpokládat, že všechny argumenty jsou hashovatelné. # Používejte pouze standardní knihovnu Pythonu.

98

Jak zabránit kolizím cache mezi různými funkcemi, které jsou volány se stejnými argumenty, například add(2, 3) a multiply(2, 3)?

98

# # Předpokládejme, že všechny argumenty jsou hashovatelné. # Používejte pouze standardní knihovnu Pythonu. _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 předpokládat, že všechny argumenty jsou hashovatelné. # Použijte pouze standardní knihovnu 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")

92