Post content
Кеширование, это способ оптимизировать скорость программы за счёт повторного переиспользования рассчитанных данных. При этом инвалидация кеша вопрос сложный и неоднозначный. Тем не менее, есть ряд простых случаев, когда кеш вполне уместен. Имеется функция, которая принимает аргументы и возвращает некое значение. При одинаковых аргументах результат всегда одинаковый. Давайте приведём такой очевидный пример: def add(a, b): return a + b Каждому понятно, что, если в эту функцию мы будем отправлять одни и те же данные, мы будем получать одинаковый результат, это важно. Тогда зачем нам каждый раз это пересчитывать? Давайте кешировать! Для этого используем готовое решение из стандартной библиотеки functools.lru_cache() (Python3.4+) from functools import lru_cache import time @lru_cache(maxsize=64) def add(a, b): time.sleep(1) return a + b Добавил задержку чтобы имитировать расчёты. Параметр декоратора maxsize указывает сколько именно разных пар аргументы-результат мы будем хранить. Теперь вызываем функцию с замером времени. Используем массив с повторяющимися значениями >>> for i in [1, 2, 3, 2, 1, 4]: >>> start = time.perf_counter() >>> add(2, i) >>> end = time.perf_counter()-start >>> print(f'i={i}, Time={end}') i=1, Time=1.0007981109 i=2, Time=1.0008854520 i=3, Time=1.0008842469 i=2, Time=0.0000204799 # из кеша i=1, Time=0.0000132510 # из кеша i=4, Time=1.0008038339 В распечатке времени видно, как только входящие данные повторяются, вместо пересчёта нам возвращается готовое значение из кеша. Такое кеширование будет неверным, если результат зависит не только от входящих данных. Учитывайте это! #tricks