Sobes.tech

# cache функциясының кодын жазыңыз. Ол декоратор болуы керек, # ол декорланған функция қайтарған мәнді есінде сақтап, бірдей аргументтермен қайта шақырғанда # сақталған мәнді қайтарады. # Барлық аргументтер хештелетін деп есептеңіз. # Тек Python стандартты кітапханасын пайдаланыңыз.

143

Мемоизация кэшінің кілтін құру кезінде kwargs-ты неге сұрыптау керек?

135

Өлшемі шектеусіз және шығару саясаты жоқ мемоизация кэш үшін әдеттегі dict орнына OrderedDict қажет пе?

121

In-memory кэштің шектеулері мен мәселелері қандай, әсіресе бірнеше жұмысшыға арналған микросервистерді масштабтау кезінде?

114

# cache функциясына арналған код жазу. Бұл декоратор, ол # декораторланған функция қайтарған мәнді есте сақтап, қайталанған шақыруларда # сол сақталған мәнді қайтарады. # Барлық аргументтер хештелетін деп есептеуге болады. # Тек Python стандартты кітапханасын пайдалану керек. def cache(backend=None): if backend is None: backend = {} def decorator(func): def wrapper(*args, **kwargs): кілт = (args, tuple(sorted(kwargs.items()))) нәтиже = backend.get(кілт) if нәтиже is not None: return нәтиже нәтиже = func(*args, **kwargs) backend[кілт] = нәтиже return нәтиже return wrapper return decorator шақырулар = {"count": 0} backend = {} @cache(backend=backend) def add(a, b): шақырулар["count"] += 1 return a + b assert add(1, 2) == 3 assert шақырулар["count"] == 1 assert add(1, 2) == 3 assert шақырулар["count"] == 1 assert len(backend) == 1 print("Жақсы")

109

# 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

Бірдей аргументтері бар әртүрлі функциялар арасында кэш қақтығысын қалай болдырмауға болады, мысалы add(2, 3) және multiply(2, 3)?

99

# Кэш функциясының кодын жазыңыз. Бұл декоратор болуы керек, # ол декораторланған функция қайтарған мәнді есінде сақтап, бірдей аргументтермен қайта шақырғанда # сақталған мәнді қайтарады. # # Барлық аргументтер хештелетін деп есептеңіз. # Тек Python стандарт кітапханасын пайдаланыңыз.

98

# Бұл барлық аргументтер хэштеуге болатын деп болжауға болады. # Тек Python стандартты кітапханасын пайдаланыңыз. _SANTINEL = объект() 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

# # Барлық аргументтер хештеуге болатын деп есептеңіз. # Тек 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