Кеширование, это способ оптимизировать скорость программы за счёт повторного переиспользования рассчитанных данных. При этом инвалидация кеша вопрос сложный и неоднозначный. Тем не менее, есть ряд простых случаев, когда кеш вполне уместен.
Имеется функция, которая принимает аргументы и возвращает некое значение. При одинаковых аргументах результат всегда одинаковый.
Давайте приведём такой очевидный пример:
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