Sobes.tech

Python

# Napišite kod za funkciju cache. To je dekorator koji treba # da pamti šta je dekorisana funkcija vratila i da vraća sačuvanu # vrednost pri ponovnom pozivu sa istim argumentima. # Pretpostavite da su svi argumenti hashabilni. # Koristite samo standardnu biblioteku Pythona.

143

Zašto sortirati kwargs prilikom izrade ključa keš memorije?

135

Da li je potrebno koristiti OrderedDict umesto običnog dict za memoization keš bez ograničenja veličine i politike istiskivanja?

120

Koja su ograničenja i problemi in-memory keš memorije, posebno pri skaliranju mikroservisa na više radnika?

114

# Напишите код за функцију cache. Ово је декоратор који треба # да памти шта је вратила декорирана функција и да врати чувану # вредност при поновном позиву са истим аргументима. # # Може се претпоставити да су сви аргументи хешабилни. # Користите само стандардну библиотеку 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

# Напишите код для функции cache. Это декоратор, который должен # запоминать, что вернула декорированная функция, и возвращать запомненное # значение при повторном вызове с одинаковыми аргументами. # Можно считать, что все аргументы хешируемые. # Использовать только стандартную библиотеку 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

# Napišite kod za funkciju cache. Ovo je dekorator koji treba # da pamti šta je dekorisana funkcija vratila i da vraća sačuvanu # vrednost pri ponovnom pozivu sa istim argumentima. # # Može se pretpostaviti da su svi argumenti hashabilni. # Koristite samo standardnu biblioteku Pythona.

98

Kako izbeći kolizije keš memorije između različitih funkcija koje se pozivaju sa istim argumentima, na primer add(2, 3) i multiply(2, 3)?

98

# Може се предположити, че всички аргументи са хешируеми. # Използвайте само стандартната библиотека на 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

# # Можно считать, что все аргументы хешируемые. # Используйте только стандартную библиотеку 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