Sobes.tech

Python

# Napisz kod dla funkcji cache. To jest dekorator, który powinien # zapamiętywać, co zwróciła dekorowana funkcja, i zwracać zapamiętaną # wartość przy ponownym wywołaniu z tymi samymi argumentami. # Można założyć, że wszystkie argumenty są haszowalne. # Używaj tylko standardowej biblioteki Pythona.

141

Dlaczego sortować kwargs podczas tworzenia klucza pamięci podręcznej memoization?

134

Czy konieczne jest użycie OrderedDict zamiast zwykłego słownika do pamięci podręcznej memoization bez limitu rozmiaru i polityki usuwania?

117

Jakie ograniczenia i problemy występują w pamięci podręcznej in-memory, szczególnie podczas skalowania mikroserwisów na kilku workerów?

112

# Napisz kod dla funkcji cache. To dekorator, który powinien # zapamiętywać, co zwróciła dekorowana funkcja, i zwracać zapamiętaną # wartość przy ponownym wywołaniu z tymi samymi argumentami. # Można założyć, że wszystkie argumenty są haszowalne. # Używaj tylko standardowej biblioteki Pythona. 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")

107

# Napisz kod dla funkcji cache. To dekorator, który powinien # zapamiętywać, co zwróciła dekorowana funkcja, i zwracać zapamiętaną # wartość przy ponownym wywołaniu z tymi samymi argumentami. # # Można założyć, że wszystkie argumenty są haszowalne. # Używaj tylko standardowej biblioteki Pythona. 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

# Napisz kod dla funkcji cache. To jest dekorator, który powinien # zapamiętywać, co zwróciła dekorowana funkcja, i zwracać zapamiętaną # wartość przy ponownym wywołaniu z tymi samymi argumentami. # # Można założyć, że wszystkie argumenty są haszowalne. # Używać tylko standardowej biblioteki Pythona.

98

Jak uniknąć kolizji w pamięci podręcznej między różnymi funkcjami wywoływanymi z tymi samymi argumentami, na przykład add(2, 3) i multiply(2, 3)?

98

# Można założyć, że wszystkie argumenty są hashowalne. # Używaj tylko standardowej biblioteki Pythona. _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")

94

# # Można założyć, że wszystkie argumenty są hashowalne. # Używaj tylko standardowej biblioteki Pythona. _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