# Írjon kódot a cache függvényhez. Ez egy dekorátor, amelynek # meg kell jegyeznie, hogy mit adott vissza a dekorált függvény, és # vissza kell adnia a tárolt értéket ismételt hívásoknál ugyanazokkal a argumentumokkal. # Feltételezhető, hogy minden argumentum hash-olható. # Csak a Python standard könyvtárát használja.
Python
Miért kell rendezni a kwargs-t a memoizációs cache kulcsának építésekor?
Szükséges az OrderedDict a szokásos dict helyett a méretkorlát nélküli memoization cache esetén, és a kiszorítási politika nélkül?
Milyen korlátai és problémái vannak az in-memory cache-nek, különösen mikroszolgáltatások több munkásra való skálázásakor?
# Írjon kódot a cache funkcióhoz. Ez egy dekorátor, amelynek # meg kell jegyeznie, hogy mit adott vissza a dekorált függvény, és # vissza kell adnia a tárolt értéket ismételt híváskor ugyanazokkal a # argumentumokkal. # Feltételezhető, hogy minden argumentum hash-olható. # Csak a Python standard könyvtárát használja. 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")
# Írjon kódot a cache funkcióhoz. Ez egy dekorátor, amelynek # meg kell jegyeznie, hogy mit adott vissza a dekorált függvény, és # vissza kell adnia a megjegyzett értéket ismételt hívásoknál ugyanazzal # a argumentummal. # # Feltételezhető, hogy minden argumentum hash-olható. # Csak a Python szabványos könyvtárát használja. 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")
# Írjon kódot a cache függvényhez. Ez egy dekorátor, amelynek # meg kell jegyeznie, hogy mit adott vissza a dekorált függvény, és # vissza kell adnia a tárolt értéket ismételt híváskor ugyanazokkal a argumentumokkal. # # Feltételezhető, hogy minden argumentum hash-olható. # Csak a Python szabványos könyvtárát használja.
Hogyan kerülhető el a cache ütközése különböző funkciók között, amelyek ugyanazokat a argumentumokat hívják meg, például add(2, 3) és multiply(2, 3)?
# # Feltételezhetjük, hogy minden argumentum hash-olható. # Csak a Python szabványos könyvtárát használja. _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")
# Feltételezhetjük, hogy minden argumentum hash-olható. # Csak a Python szabványos könyvtárát használja. _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")