Sobes.tech

Python

# Parašykite kodą funkcijai cache. Tai yra dekoratorius, kuris # turėtų prisiminti, ką grąžino dekoruota funkcija, ir grąžinti saugomą # reikšmę pakartotinio kvietimo su tais pačiais argumentais metu. # Manoma, kad visi argumentai yra hashable. # Naudokite tik Python standartinę biblioteką.

140

Kodėl reikia rūšiuoti kwargs kuriant memoization talpyklos raktą?

133

Ar būtina naudoti OrderedDict vietoj įprasto dict, norint sukurti memoization talpyklą be dydžio apribojimo ir išstūmimo politikos?

117

Kokios yra in-memory talpyklos apribojimai ir problemos, ypač kai mastuojate mikroservisus kelių darbuotojų įrenginiais?

111

# Parašykite kodą funkcijai cache. Tai turi būti dekoratorius, kuris # turėtų prisiminti, ką grąžino dekoruota funkcija, ir grąžinti saugomą # reikšmę pakartotinio kvietimo su tais pačiais argumentais metu. # Galima manyti, kad visi argumentai yra hash'able. # Naudokite tik Python standartinę biblioteką. 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")

106

# Parašykite kodo funkcijai cache. Tai turi būti dekoratorius, kuris # turėtų prisiminti, ką grąžino dekoruota funkcija, ir grąžinti # saugomą reikšmę pakartotinio kvietimo su tais pačiais argumentais metu. # # Manoma, kad visi argumentai yra hash'able. # Naudokite tik Python standartinę biblioteką. 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

# Parašykite kodo funkcijai cache. Tai yra dekoratorius, kuris turi # prisiminti, ką grąžino dekoruota funkcija, ir grąžinti saugomą # reikšmę pakartotinio kvietimo su tais pačiais argumentais metu. # # Manoma, kad visi argumentai yra hashable. # Naudokite tik Python standartinę biblioteką.

98

Kaip išvengti kasyklos susidūrimo tarp skirtingų funkcijų, kurios kviečiamos su tais pačiais argumentais, pavyzdžiui, add(2, 3) ir multiply(2, 3)?

98

# # Manoma, 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")

93

# Manoma, kad visi argumentai yra hash'able. # Naudokite tik Python standartinę biblioteką. _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")

93