# Schreiben Sie Code für die Funktion cache. Es ist ein Dekorator, der # sich daran erinnern soll, was die dekorierte Funktion zurückgegeben hat, und # den gespeicherten Wert bei wiederholtem Aufruf mit denselben Argumenten zurückgeben soll. # Es kann angenommen werden, dass alle Argumente hashbar sind. # Verwenden Sie nur die Standardbibliothek von Python.
Python
Warum kwargs beim Erstellen des Schlüssels für den Memoization-Cache sortieren?
Ist es notwendig, anstelle eines normalen dict ein OrderedDict für einen Memoization-Cache ohne Größenbegrenzung und Austauschpolitik zu verwenden?
Welche Einschränkungen und Probleme gibt es bei einem In-Memory-Cache, insbesondere beim Skalieren von Microservices auf mehrere Worker?
# Code für die Funktion cache schreiben. Es ist ein Dekorator, der # sich merken soll, was die dekorierte Funktion zurückgegeben hat, und # den gespeicherten Wert bei wiederholtem Aufruf mit denselben Argumenten # zurückgeben soll. # # Es kann angenommen werden, dass alle Argumente hashbar sind. # Nur die Standardbibliothek von Python verwenden. 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")
# Schreiben Sie Code für die Funktion cache. Es ist ein Dekorator, der # sich daran erinnern soll, was die dekorierte Funktion zurückgegeben hat, # und den gespeicherten Wert bei wiederholtem Aufruf mit denselben Argumenten # zurückgeben soll. # Es kann angenommen werden, dass alle Argumente hashbar sind. # Verwenden Sie nur die Standardbibliothek von 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")
# Schreiben Sie den Code für die Funktion cache. Es ist ein Dekorator, der # sich daran erinnern soll, was die dekorierte Funktion zurückgegeben hat, und # den gespeicherten Wert bei wiederholtem Aufruf mit denselben Argumenten zurückgeben soll. # # Es kann angenommen werden, dass alle Argumente hashbar sind. # Verwenden Sie nur die Standardbibliothek von Python.
Wie kann man Cache-Kollisionen zwischen verschiedenen Funktionen vermeiden, die mit den gleichen Argumenten aufgerufen werden, zum Beispiel add(2, 3) und multiply(2, 3)?
# # Es kann davon ausgegangen werden, dass alle Argumente hashbar sind. # Verwenden Sie nur die Standardbibliothek von 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")
# Es kann davon ausgegangen werden, dass alle Argumente hashbar sind. # Verwenden Sie nur die Standardbibliothek von 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")