Напишите декоратор cached который будет кэшировать результат вызова функции
Перейти к содержимому

Напишите декоратор cached который будет кэшировать результат вызова функции

  • автор:

Напишите декоратор cached который будет кэшировать результат вызова функции

Создайте декоратор makeCaching(f) , который берет функцию f и возвращает обёртку, которая кеширует её результаты.

В этой задаче функция f имеет только один аргумент, и он является числом.

  1. При первом вызове обёртки с определённым значением аргумента – она вызывает f и запоминает её результат.
  2. При втором и последующих вызовах с тем же значением аргумента – возвращается сохранённое значение результата.

Должно работать так:

function f(x) < return Math.random() * x; // random для удобства тестирования >function makeCaching(f) < /* ваш код */ >f = makeCaching(f); var a, b; a = f(1); b = f(1); alert( a == b ); // true (значение закешировано) b = f(2); alert( a == b ); // false, другой аргумент => другое значение

Запоминать результаты вызова функции будем в замыкании, в объекте cache: < ключ:значение >.

function f(x) < return Math.random()*x; >function makeCaching(f) < var cache = <>; return function(x) < if (!(x in cache)) < cache[x] = f.call(this, x); >return cache[x]; >; > f = makeCaching(f); var a = f(1); var b = f(1); alert( a == b ); // true (значение закешировано) b = f(2); alert( a == b ); // false, другой аргумент => другое значение

Обратите внимание: проверка на наличие уже подсчитанного значения выглядит так: if (x in cache) . Менее универсально можно проверить так: if (cache[x]) , это если мы точно знаем, что cache[x] никогда не будет false , 0 и т.п.

function makeCaching(f) < var cache = <>; return function(x) < if (!(x in cache)) < cache[x] = f.call(this, x); >return cache[x]; >; >

Декоратор для кэширования

Author24 — интернет-сервис помощи студентам

Декоратор для кэширования
Задача: Напишите декоратор cached, который будет кэшировать результат вызова функции. Пример.

Написать простой декоратор, используя декоратор wraps, для передачи данных от оригинальной функции
На python Написать простой декоратор, используя декоратор wraps, для передачи данных от.

Как написать декоратор для синхронизации доступа к БД?
Как написать декоратор для синхронизации доступа к БД? Приложение стало использовать.

Написать декоратор для оценки времени вычисления функции
Написать декоратор для оценки времени вычисления функции. Оценить время выполнения функции с его.

Регистрация: 17.11.2020
Сообщений: 1
как говорится, лучше поздно, чем никогда

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
def cached(func): cache = {} def a(*args, **kwargs): nonlocal cache if not cache.get(args): g = func(*args, **kwargs) cache[args] = g return g else: return cache[args] return a @cached def fib(n): if n == 1 or n == 2: return 1 else: return fib(n - 1) + fib(n - 2)

3553 / 2156 / 568
Регистрация: 02.09.2015
Сообщений: 5,441

from functools import lru_cache as cached

710 / 349 / 120
Регистрация: 09.12.2020
Сообщений: 919
Arsegg, только хотел написать))
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Написать декоратор для оценки времени вычисления функции
имеется код, написать декоратор для оценки времени вычисления функции. Оценить время выполнения.

Напишите декоратор для превращения функции print в генератор html-тегов
# Напишите декоратор для превращения функции print в генератор html-тегов # Декоратор должен.

Декоратор для логированния методов
Реализуйте декоратор, который будет логировать все методы декорируемого класса (кроме магических.

Настройка кэширования для RAID 10
Добрый День. Поделитесь пожалуйста опытом по такому вопросу. Есть SQL сервер на нем RAID 10 из 6.

Использование Dexie для кэширования данных
Приветствую. Пытаюсь использовать Dexie для кеширования данных на стороне браузера. Проблема в.

Создать метод для считывания строк из TextBox (патерн декоратор) для класса Stream
Здравствуйте, нужно создать метод для считывания строки из TextBox (патерн декоратор) для класса.

Или воспользуйтесь поиском по форуму:

Декоратор @cache() модуля functools в Python, кеширующий декоратор

Функция cache() модуля functools представляет собой простой легкий неограниченный кеш функций. Иногда называется «memoization«.

Возвращает то же самое, что и @lru_cache(maxsize=None) , создавая тонкую оболочку вокруг поиска по словарю для аргументов функции. Так как ему никогда не нужно удалять старые значения, он меньше и быстрее, чем @functools.lru_cache() с ограничением размера.

Пример использования декоратора @functools.cache :

import functools @functools.cache def factorial(n): return n * factorial(n-1) if n else 1 # нет ранее кэшированного результата, # выполняет 11 рекурсивных вызовов >>> factorial(10) # 3628800 # просто ищет результат кэшированного значения >>> factorial(5) # 120 # делает два новых рекурсивных вызова, # остальные 10 кэшируются >>> factorial(12) # 479001600 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Способы использования модуля functools
  • Декоратор @cached_property модуля functools
  • Функция cmp_to_key() модуля functools
  • Декоратор @cache() модуля functools, кеширующий декоратор
  • Декоратор @lru_cache() модуля functools
  • Декоратор @total_ordering модуля functools
  • Функция partial() модуля functools
  • Класс partialmethod() модуля functools
  • Функция reduce() модуля functools
  • Декоратор @singledispatch модуля functools
  • Декоратор @singledispatchmethod модуля functools
  • Декоратор @update_wrapper() модуля functools
  • Декоратор @wraps() модуля functools

ХОЧУ ПОМОЧЬ
ПРОЕКТУ

Кэширование возвращаемых значений в декораторах

Декораторы могут обеспечить хороший механизм для кэширования и запоминания. В качестве примера рассмотрим рекурсивное определение последовательности Фибоначчи:

def fib(num): if num  2: return num return fib(num - 1) + fib(num - 2) 

Хотя реализация проста, ее производительность во время выполнения ужасна:

>>> start = time.perf_counter(); fib(20); print('Time run:', time.perf_counter() - start) # 6765 # Time run: 0.005267535000712087 >>> start = time.perf_counter(); fib(30); print('Time run:', time.perf_counter() - start) # 832040 # Time run: 0.1682777839996561 

Чтобы вычислить десятое число Фибоначчи, вам нужно вычислить только предыдущие числа Фибоначчи, но эта реализация каким-то образом требует колоссальных 177 вычислений. Ситуация быстро ухудшается для fib(20) — 21891 вычисление и почти 2,7 миллиона вычислений для fib(30) . Это происходит потому, что код продолжает вычислять числа Фибоначчи, которые уже известны.

Обычным решением является реализация чисел Фибоначчи с использованием цикла for . in и таблицы подстановки. Простое кэширование вычислений также делает свое дело:

import functools def cache(func): """Кэш предыдущих вызовов функций""" cache = <> @functools.wraps(func) def wrapper(*args, **kwargs): cache_key = args + tuple(kwargs.items()) if cache_key not in cache: cache[cache_key] = func(*args, **kwargs) return cache[cache_key] return wrapper @cache def fib(num): if num  2: return num return fib(num - 1) + fib(num - 2) 

Кэш работает как таблица подстановки, поэтому теперь функция fib() выполняет необходимые вычисления только один раз. Это сразу заметно по времени выполнения функции. Сравните с предыдущим запуском функции, без кэширующего декоратора в начале материала:

>>> import time >>> start = time.perf_counter(); fib(20); print('Time run:', time.perf_counter() - start) # 6765 # Time run: 4.560499928629724e-05 >>> start = time.perf_counter(); fib(30); print('Time run:', time.perf_counter() - start) # 832040 # Time run: 0.000410601000112365 

В стандартной библиотеке доступны 2 кэширующих декоратора:

  • Декоратор @functools.cache модуля functools представляет собой простой легкий неограниченный кеш функций. Иногда называется «memoization».
  • Декоратор @functools.lru_cache кэш LRU. Этот декоратор имеет больше возможностей, чем тот, который представлен для примера.
import functools, time @functools.lru_cache(maxsize=50) def fib(num): if num  2: return num return fib(num - 1) + fib(num - 2) >>> start = time.perf_counter(); fib(30); print('Time run:', time.perf_counter() - start) # 832040 # Time run: 0.00011347100007697009 >>> fib.cache_info() # CacheInfo(hits=28, misses=31, maxsize=50, currsize=31) 

Можно использовать метод fib.cache_info() , чтобы увидеть, как работает кэш, так-же можно его настроить, если это необходимо.

В декораторе @functools.lru_cache(maxsize=50) , параметр maxsize указывает сколько последних вызовов кэшируется. Значение по умолчанию равно 128, но вы можете указать maxsize=None для кэширования всех вызовов функций. Однако имейте в виду, что это может вызвать проблемы с памятью.

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Захват аргументов функцией декоратором
  • Возврат значений из декорируемой функции
  • Атрибут __name__ декорируемой функции
  • Шаблон декоратора общего назначения
  • Декораторы с аргументами
  • Вложенные декораторы
  • Кэширование значений в декораторах Python
  • Класс как декоратор функции Python
  • Декораторы методов класса
  • Декораторы классов
  • Практические примеры применения декоратора Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *