Sobes.tech

Python

# Schrijf code voor de functie cache. Het is een decorator die # moet onthouden wat de gedecoreerde functie heeft geretourneerd, en # de opgeslagen waarde teruggeven bij herhaalde aanroepen met dezelfde argumenten. # Het mag worden aangenomen dat alle argumenten hashbaar zijn. # Gebruik alleen de standaardbibliotheek van Python.

142

Waarom kwargs sorteren bij het bouwen van de sleutel van de memoisatie-cache?

135

Is het nodig om een OrderedDict te gebruiken in plaats van een gewoon dict voor een memoization-cache zonder limiet op de grootte en vervangingsbeleid?

120

Wat zijn de beperkingen en problemen van in-memory cache, vooral bij het schalen van microservices naar meerdere workers?

114

# Schrijf code voor de functie cache. Het is een decorator die moet # onthouden wat de gedecoreerde functie heeft teruggegeven, en de opgeslagen # waarde teruggeven bij herhaalde oproepen met dezelfde argumenten. # # Er mag worden aangenomen dat alle argumenten hashbaar zijn. # Gebruik alleen de standaardbibliotheek van Python. 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")

109

# Schrijf code voor de cache-functie. Het is een decorateur die # moet onthouden wat de gedecoreerde functie heeft teruggegeven, # en de opgeslagen waarde moet teruggeven bij herhaalde oproepen # met dezelfde argumenten. # Het mag worden aangenomen dat alle argumenten hashbaar zijn. # Gebruik alleen de standaardbibliotheek van Python. 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")

108

# Schrijf code voor de functie cache. Het is een decorator die moet # onthouden wat de gedecoreerde functie heeft teruggegeven, en de opgeslagen # waarde teruggeven bij herhaalde aanroepen met dezelfde argumenten. # # Het mag worden aangenomen dat alle argumenten hanteerbaar zijn. # Alleen de standaardbibliotheek van Python gebruiken.

98

Hoe voorkom je cache-conflicten tussen verschillende functies die met dezelfde argumenten worden aangeroepen, bijvoorbeeld add(2, 3) en multiply(2, 3)?

98

# Kan worden aangenomen dat alle argumenten hashbaar zijn. # Gebruik alleen de standaardbibliotheek van Python. _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")

96

# # Kan worden aangenomen dat alle argumenten hashbaar zijn. # Gebruik alleen de standaardbibliotheek van 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")

94