Простое в использовании кэширование функций и методов.
supercache был разработан как декоратор для работы с функциями и методами, обеспечивающий почти мгновенное повторение выполнения с помощью всего лишь одной дополнительной строки кода. Он действует как интерфейс для механизма кэширования, который может быть чем угодно: от кэширования в памяти до использования Redis (при условии, что он закодирован).
Обратите внимание, что использование декоратора добавляет небольшие накладные расходы, поскольку он был разработан для удобства и стабильности, а не для производительности. Вполне возможно, что кэширование очень простой функции может привести к ухудшению производительности (примерно это занимает 1 секунду на 40 000 выполнений).
pip install supercache
from supercache import cache
# Basic cache
@ cache ()
def function ( x , y = None ):
return ( x , y )
# Set timeout
@ cache ( ttl = 60 )
def function ( x , y = None ):
return ( x , y )
# Ignore the y argument
@ cache ( ignore = [ 'y' ])
def function ( x , y = None ):
return ( x , y )
# Ignore anything after the first 2 arguments
@ cache ( keys = [ 0 , 1 ])
def function ( x , y = None , * args , ** kwargs ):
return ( x , y )
# Set up a custom cache engine
from supercache . engine import Memory
cache = Cache ( engine = Memory ( mode = Memory . FIFO , ttl = 600 , count = 100000 , size = 100000 ))
# Manually handle cache to reduce the decorator overhead
# This is in danger of collisions if the key is not unique
from supercache . exceptions import CacheError
def function ( x , y = None ):
key = 'function;{};{}' . format ( x , y )
try :
return cache . get ( key )
except CacheError :
value = ( x , y )
cache . put ( key , value )
return value
# Functions
@ cache ()
def function ():
pass
# Methods
class Class ( object ):
@ cache ()
def method ( self ):
pass
# Generators/iterators
@ cache ()
def generator ():
yield
# Lambdas
func = cache ()( lambda : None )
Установите, какие параметры функции использовать при генерации ключа кэша. Все доступные параметры будут использоваться по умолчанию.
Они могут быть в формате int
, str
, slice
(полезно для *args
) или regex
(полезно для **kwargs
).
Установите, какие параметры игнорировать при генерации ключа кэша. Это отменит любые настройки, указанные в keys
.
Они также могут быть в формате int
, str
, slice
или regex
Переопределите настройку ttl механизма, чтобы указать, сколько секунд должно пройти до того, как кеш станет недействительным.
Если кэшируемая функция является генератором, установка для этого параметра значения True
приведет к преобразованию вывода в tuple
при первом вызове вместо возврата итератора.
Причина этого в том, что кэширование генератора требует больших накладных расходов, которые могут стать очень заметными при тысячном вызове простого генератора.
Псевдоним: cache[key]
Прочитайте элемент кэша или выдайте ошибку, если он не существует.
Псевдоним: cache[key] = value
Установите новый элемент кэша.
Псевдоним: del cache[key]
Удалить кеш для клавиши или функции.
cache.delete()
: Удалить все кэшированные данные.cache.delete(key)
: Удалить кэшированные данные для определенного key
.cache.delete(func)
: Удалять кэшированные данные при каждом выполнении func
.cache.delete(func, 1, b=2)
: Удалить кэшированные данные для func(1, b=2)
.Возвращает счетчик того, сколько раз кэш был прочитан для ключа или функции.
cache.hits()
: общее количество попаданий в кеш.cache.hits(key)
: количество попаданий для определенного key
.cache.hits(func)
: количество попаданий в кэш для каждого выполнения func
.cache.hits(func, 1, b=2)
: количество попаданий в кеш специально для func(1, b=2)
.Возвращает количество раз, когда кэш был создан для ключа или функции.
cache.misses()
: общее количество промахов в кэше.cache.misses(key)
: количество промахов для определенного key
.cache.misses(func)
: количество промахов в кеше для каждого выполнения func
.cache.misses(func, 1, b=2)
: количество промахов в кеше специально для func(1, b=2)
.Получите, существует ли кеш для ключа или функции.
cache.exists()
: если кэш существует.cache.exists(key)
: если key
существует в кеше.cache.exists(func)
: если в кеше существует какое-либо выполнение func
.cache.exists(func, 1, b=2)
: если func(1, b=2)
существует в кеше.Установите режим очистки кэша. Возможные варианты: FIFO (первым пришел — первым обслужен), FILO (первым пришел последним), LRU (наименее используемый), MRU (наиболее последний раз использованный) или LFU (наименее часто используемый).
Установите, сколько секунд должно пройти до того, как кеш станет недействительным.
Установите максимальное количество кэшируемых результатов.
Установите максимальный размер кэша в байтах. Это мягкое ограничение, при котором сначала будет выделена память, а затем старый кеш будет удален до тех пор, пока его объем не достигнет предела.
Последнее выполнение всегда будет кэшироваться, даже если максимальный размер меньше результата.
classmethods
, staticmethods
и properties
могут быть кэшированы только в том случае, если сначала выполняется декоратор кэша.