Sobes.tech

Python

# Uzrakstiet kodu funkcijai cache. Tas ir dekorators, kas # atcerēsies, ko atgrieza dekorētā funkcija, un atgriezīs saglabāto # vērtību atkārtotās izsaukšanas laikā ar tiem pašiem argumentiem. # Var pieņemt, ka visi argumenti ir hashable. # Izmantojiet tikai Python standarta bibliotēku.

143

Kāpēc jāveic kwargs kārtošana, veidojot memoizācijas kešatmiņas atslēgu?

135

Vai ir nepieciešams izmantot OrderedDict vietā parasto dict, lai izveidotu memoizācijas kešatmiņu bez izmēra ierobežojuma un izslēgšanas politikas?

121

Kādi ir in-memory kešatmiņas ierobežojumi un problēmas, īpaši mērogojot mikroservisus vairākos darbiniekos?

114

# Uzrakstiet koda funkcijai cache. Tā ir dekoratora funkcija, kas # atcerēsies, ko atgrieza dekorētā funkcija, un atgriezīs saglabāto # vērtību atkārtotā izsaukuma laikā ar tiem pašiem argumentiem. # Var pieņemt, ka visi argumenti ir hashējami. # Izmantojiet tikai Python standarta bibliotēku. 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")

109

# Uzrakstiet koda funkcijai cache. Tas ir dekorators, kas # atcerēsies, ko atgrieza dekorētā funkcija, un atgriezīs saglabāto # vērtību atkārtotā izsaukumā ar tiem pašiem argumentiem. # # Var pieņemt, ka visi argumenti ir hashable. # Izmantojiet tikai Python standarta bibliotēku. 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

# Uzrakstiet kodu funkcijai cache. Tā ir dekorators, kas # atcerēsies, ko atgrieza dekorētā funkcija, un atgriezīs saglabāto # vērtību atkārtotās izsaukšanas ar tiem pašiem argumentiem laikā. # # Var pieņemt, ka visi argumenti ir hashable. # Izmantojiet tikai Python standarta bibliotēku.

98

Kā izvairīties no kešatmiņas sadursmēm starp dažādām funkcijām, kas tiek izsauktas ar tiem pašiem argumentiem, piemēram, add(2, 3) un multiply(2, 3)?

98

# Pieņemot, ka visi argumenti ir hashējami. # Izmantojiet tikai Python standarta bibliotēku. _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")

97

# # Varbūt galima manyti, kad visi argumentai yra hash'able. # Naudokite tik Python standartinę biblioteką. _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