Учтите следующее:
@property
def name(self):
if not hasattr(self, '_name'):
# expensive calculation
self._name = 1 + 1
return self._name
Я новичок, но я думаю, что кэширование может быть преобразовано в декоратор. Только я такого не нашел;)
PS реальный расчет не зависит от изменчивых значений
python
caching
decorator
memoization
Тобиас
источник
источник
Ответы:
Начиная с Python 3.2 есть встроенный декоратор:
@functools.lru_cache(maxsize=100, typed=False)
Пример кэша LRU для вычисления чисел Фибоначчи :
Если вы застряли с Python 2.x, вот список других совместимых библиотек памятки:
functools32
| PyPI | Исходный кодrepoze.lru
| PyPI | Исходный кодpylru
| PyPI | Исходный кодbackports.functools_lru_cache
| PyPI | Исходный кодисточник
lru_cache
бы сделать копию любого результата, который он кэширует, и в реализации такая копия не создаетсяfunctools.lru_cache
. Это также может создать проблемы с памятью, которые трудно обнаружить при использовании для кэширования большого объекта.Похоже, вы не запрашиваете универсальный декоратор памятки (т. Е. Вас не интересует общий случай, когда вы хотите кэшировать возвращаемые значения для разных значений аргумента). То есть вы хотели бы иметь это:
в то время как универсальный декоратор напоминания даст вам следующее:
Я утверждаю, что синтаксис вызова метода - лучший стиль, потому что он предполагает возможность дорогостоящих вычислений, в то время как синтаксис свойства предлагает быстрый поиск.
[Обновление: декоратор памятки на основе классов, на который я ссылался и который цитировал здесь ранее, не работает для методов. Я заменил его функцией декоратора.] Если вы хотите использовать универсальный декоратор для запоминания, вот простой:
Пример использования:
Другой декоратор памятки с ограничением размера кэша можно найти здесь .
источник
fibonacci
. Эта функция всегда использует один и тот жеmemo
словарь.Пример использования:
источник
Python 3.8
functools.cached_property
декораторhttps://docs.python.org/dev/library/functools.html#functools.cached_property
cached_property
от Werkzeug упоминается по адресу: https://stackoverflow.com/a/5295190/895245, но предположительно производная версия будет объединена в 3.8, что является удивительным.Этот декоратор может рассматриваться как кеширование
@property
или очиститель,@functools.lru_cache
когда у вас нет никаких аргументов.Документы говорят:
источник
Werkzeug имеет
cached_property
декоратор ( документы , источник )источник
Я кодировал этот простой класс декоратора для кэширования ответов функций. Я нахожу это ОЧЕНЬ полезным для моих проектов:
Использование просто:
источник
@cached
пропущенная скобка. Иначе он будет возвращать толькоcached
объект на месте ,myfunc
и когда называютmyfunc()
тоinner
всегда будет возвращено в качестве возвращаемого значенияОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я автор Kids.cache .
Вы должны проверить
kids.cache
, он предоставляет@cache
декоратор, который работает на Python 2 и Python 3. Никаких зависимостей, ~ 100 строк кода. Это очень просто использовать, например, с учетом вашего кода, вы можете использовать его следующим образом:затем
Или вы можете поставить
@cache
декоратор после@property
(тот же результат).Использование кеша для свойства называется отложенной оценкой и
kids.cache
может сделать гораздо больше (он работает с функцией с любыми аргументами, свойствами, любым типом методов и даже классами ...). Для продвинутых пользователей,kids.cache
поддержка,cachetools
которая предоставляет модные хранилища кеша для python 2 и python 3 (LRU, LFU, TTL, RR cache).ВАЖНОЕ ПРИМЕЧАНИЕ : хранилище кеша по умолчанию
kids.cache
- это стандартный dict, который не рекомендуется для долго работающей программы с разными запросами, поскольку это приведет к постоянно растущему хранилищу кеширования. Для этого вы можете подключить другие хранилища кеша, например,@cache(use=cachetools.LRUCache(maxsize=2))
для украшения вашей функции / свойства / класса / метода ...)источник
c
изMyClass
, и проверить егоobjgraph.show_backrefs([c], max_depth=10)
, есть ссылка цепь от объекта классаMyClass
кc
. То естьc
никогда не будет выпущен, покаMyClass
не будет выпущен.Ах, просто нужно было найти правильное название для этого: « Ленивая оценка имущества ».
Я тоже много этим занимаюсь; возможно я когда-нибудь воспользуюсь этим рецептом в своем коде.
источник
Существует fastcache , который представляет собой «реализацию Python 3 на языке functools.lru_cache на C. Обеспечивает ускорение в 10–30 раз по сравнению со стандартной библиотекой».
То же, что выбранный ответ , только другой импорт:
Кроме того, он устанавливается в Anaconda , в отличие от functools, который необходимо установить .
источник
functools
является частью стандартной библиотеки, ссылка, которую вы разместили на случайную ветку git или что-то еще ...В Python Wiki есть еще один пример декоратора memoize :
http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
Этот пример немного умен, потому что он не будет кэшировать результаты, если параметры изменчивы. (проверьте этот код, он очень простой и интересный!)
источник
Если вы используете Django Framework, у него есть такое свойство для кэширования представления или ответа использования API,
@cache_page(time)
а также могут быть и другие параметры.Пример:
Более подробную информацию можно найти здесь .
источник
Наряду с примером Memoize я нашел следующие пакеты Python:
источник
Я реализовал что-то вроде этого, используя pickle для персистентности и используя sha1 для коротких, почти наверняка уникальных идентификаторов. По сути, кэш хэшировал код функции и историю аргументов для получения sha1, а затем искал файл с этим sha1 в имени. Если он существует, он открывает его и возвращает результат; в противном случае он вызывает функцию и сохраняет результат (при необходимости, сохранение только в том случае, если для его обработки потребовалось определенное время).
Тем не менее, я клянусь, я нашел существующий модуль, который сделал это, и попал сюда, пытаясь найти этот модуль ... Самое близкое, что я могу найти, это то, что выглядит примерно так: http: //chase-seibert.github. И.О. / блог / 2011/11/23 / pythondjango-диск на основе кэширования-decorator.html
Единственная проблема, с которой я сталкиваюсь, это то, что она не будет хорошо работать для больших входов, поскольку она хэширует str (arg), что не является уникальным для гигантских массивов.
Было бы хорошо, если бы существовал протокол unique_hash (), в котором класс возвращал бы безопасный хэш своего содержимого. Я в основном вручную реализовал это для типов, о которых я заботился.
источник
Попробуйте joblib http://pythonhosted.org/joblib/memory.html
источник
Если вы используете Django и хотите кэшировать представления, см . Ответ Нихила Кумара .
Но если вы хотите кэшировать ЛЮБОЙ результат функции, вы можете использовать django-cache-utils .
Он использует кеши Django и предоставляет простой в использовании
cached
декоратор:источник
@lru_cache
не идеален со значениями функций по умолчаниюмой
mem
декоратор:и код для тестирования:
результат - только 3 раза со сном
но с
@lru_cache
этим будет 4 раза, потому что это:будет рассчитан дважды (плохо работает со значениями по умолчанию)
источник