Рубрики
Без рубрики

Добавить кэширование в любую функцию Python в одной строке

Знаете ли вы, что Python на самом деле имеет встроенные декораторы, которые могут добавить кэш для любой функции? (Что … помечено Python.

Знаете ли вы, что Python на самом деле имеет встроенные декораторы, которые могут добавить кэш для любой функции? (Что такое декораторы?)

Допустим, у меня есть функция, которая требует немного вычислительной мощности. Для этого примера я буду использовать калькулятор последовательности фибоначчи.

def fib(x):
    if x <= 1:
        return 1
    return fib(x - 1) + fib(x)

Использование встроенного Python Functools Библиотека, я могу добавить «кэш» в одну строку. Кэш запомнит выходы вычислительной тяжелой функции, чтобы значения не должны рассчитываться несколько раз.

Если набор входов уже рассчитан, кэш Декоратор вернет рассчитанный результат без запуска fib () функция.

from functools import cache

@cache
def fib(x):
    if x <= 1:
        return 1
    return fib(x - 1) + fib(x)

Тем не менее, @cache Будут хранить неограниченное количество входов и выходов. Если мы хотим ограничить его только для того, сказать, 1000 кэшированных ценностей, мы можем использовать кэш «наименьший недавно использованный» или «LRU».

С таким типом кэша Python будет только кэшировать 1000 последних использованных значений. Если рассчитано новое значение, значение 1 001ST будет «выселен» из кэша (удаляется из памяти).

Пример 1 (Обратите внимание, что нам не нужны скобки):

from functools import lru_cache

@lru_cache
def fib(x):
    if x <= 1:
        return 1
    return fib(x - 1) + fib(x)

Пример 2 (максимальный размер 1000 элементов):

from functools import lru_cache

@lru_cache(max_size=1000)
def fib(x):
    if x <= 1:
        return 1
    return fib(x - 1) + fib(x)

Оригинал: “https://dev.to/myfatemi04/cache-any-function-in-one-line-3ig7”