2 lru_cache

@lru_cache декоратор может использоваться обернуть дорогой, вычислительно-интенсивную функцию с наименее используемым кэшем. Это позволяет запоминать вызовы функций, чтобы будущие вызовы с такими же параметрами могли возвращаться мгновенно, а не пересчитываться.

 @lru_cache(maxsize=None)  # Boundless cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

>>> fibonacci(15)

 

В приведенном выше примере, значение fibonacci(3) вычисляется только один раз, в то время как , если fibonacci не имеют кэш LRU, fibonacci(3) была бы вычислена свыше 230 раз. Следовательно, @lru_cache особенно велик для рекурсивных функций или динамического программирования, где дорогостоящая функция может вызываться несколько раз с теми же самыми точными параметрами.

@lru_cache имеет два аргумента

  • maxsize : Количество вызовов , чтобы сэкономить. Когда число уникальных вызовов превышает maxsize , кэш LRU удалит наименее недавно использованные вызовы.
  • typed (добавлен в 3.3): Флаг для определения , если эквивалентные аргументы различных типов принадлежат к разным записям кэша (т.е. если 3.0 и 3 считаются разными аргументами)

Мы также можем увидеть статистику кеша:

 >>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)

 

Примечание: Так как @lru_cache использует словари для кэширования результатов, все параметры функции должны быть hashable для кэша работать.

Официальные документы Python для @lru_cache . @lru_cache был добавлен в 3.2.