Flask: об использовании url_for совместно с декоратором lru_cache

О том, как functools.lru_cache может позволить ускорить рендеринг страницы, в шаблоне которой сотни раз вызывается функция url_for.

Несколько сотен вызовов url_for (например, если вы реализуете вывод данных из каталога) могут отрицательно повлиять на время рендеринга страницы. Для улучшения ситуации может оказаться полезным использование механизма LRU-кэширования. Это кеш с конечным размером, где наиболее часто используемые записи вытесняют прочие.

@functools.lru_cache(maxsize=2560)
def caching_url_for(endpoint, **values):
    """A version of `url_for` that caches the output"""
    return url_for(endpoint, **values)

В данном примере декоратор functools.lru_cache запоминает результат выполнения функции caching_url_for для переданных наборов аргументов. Такое кеширование позволяет экономить время и ресурсы, если сложная функция вызывается часто с одинаковым набором аргументов.

Оценка производительности

Я сделал небольшой тест (150 проходов) и получил такие результаты.

Функция Среднее время
url_for 0.0211
cached_url_for 0.0009

Разрабочик Anthony Blackshaw (спасибо ему за идею) на своем проекте добился 60-кратного ускорения.