Есть ли библиотека кэширования Python? [закрытый]
Я ищу библиотеку кэширования Python, но пока ничего не могу найти. Мне нужен простой dict-подобный интерфейс, где я могу установить ключи и их действия и вернуть их в кэше. Что-то вроде:
cache.get(myfunction, duration=300)
который даст мне элемент из кэша, если он существует или вызовет функцию и сохранит его, если он не существует или истек. Кто-нибудь знает что-то подобное?
12 ответов:
из Python 3.2 вы можете использовать декоратор @lru_cache из библиотеки functools. Это последний недавно используемый кэш, поэтому нет времени истечения срока действия для элементов в нем, но как быстрый хак это очень полезно.
from functools import lru_cache @lru_cache(maxsize=256) def f(x): return x*x for x in range(20): print f(x) for x in range(20): print f(x)
вы также можете взглянуть на Memoize декоратор. Вы, вероятно, могли бы заставить его делать то, что вы хотите, без особых изменений.
Joblibhttp://packages.python.org/joblib/ поддерживает функции кэширования в шаблоне Memoize. В основном, идея заключается в кэшировании вычислительно дорогих функций.
>>> from joblib import Memory >>> mem = Memory(cachedir='/tmp/joblib') >>> import numpy as np >>> square = mem.cache(np.square) >>> >>> a = np.vander(np.arange(3)).astype(np.float) >>> b = square(a) ________________________________________________________________________________ [Memory] Calling square... square(array([[ 0., 0., 1.], [ 1., 1., 1.], [ 4., 2., 1.]])) ___________________________________________________________square - 0...s, 0.0min >>> c = square(a)вы также можете делать причудливые вещи, такие как использование @memory.кэш-декоратор по функциям. Документация находится здесь:http://packages.python.org/joblib/memory.html
никто еще не упоминал shelve. https://docs.python.org/2/library/shelve.html
Это не используется, но выглядит гораздо проще и может соответствовать вашим потребностям.
Я думаю python memcached API является распространенным инструментом, но я не использовал его сам и не уверен, поддерживает ли он необходимые функции.
import time class CachedItem(object): def __init__(self, key, value, duration=60): self.key = key self.value = value self.duration = duration self.timeStamp = time.time() def __repr__(self): return '<CachedItem {%s:%s} expires at: %s>' % (self.key, self.value, time.time() + self.duration) class CachedDict(dict): def get(self, key, fn, duration): if key not in self \ or self[key].timeStamp + self[key].duration < time.time(): print 'adding new value' o = fn(key) self[key] = CachedItem(key, o, duration) else: print 'loading from cache' return self[key].value if __name__ == '__main__': fn = lambda key: 'value of %s is None' % key ci = CachedItem('a', 12) print ci cd = CachedDict() print cd.get('a', fn, 5) time.sleep(2) print cd.get('a', fn, 6) print cd.get('b', fn, 6) time.sleep(2) print cd.get('a', fn, 7) print cd.get('b', fn, 7)
попробуйте redis, это одно из самых чистых и простых решений для приложений для обмена данными атомарным способом или если у вас есть какая-то платформа веб-сервера. Его очень легко настроить, вам понадобится клиент python redishttp://pypi.python.org/pypi/redis
вы можете использовать мое простое решение проблемы. Это действительно просто, ничего особенного:
class MemCache(dict): def __init__(self, fn): dict.__init__(self) self.__fn = fn def __getitem__(self, item): if item not in self: dict.__setitem__(self, item, self.__fn(item)) return dict.__getitem__(self, item) mc = MemCache(lambda x: x*x) for x in xrange(10): print mc[x] for x in xrange(10): print mc[x]ему действительно не хватает функциональности истечения срока действия, но вы можете легко расширить его, указав конкретное правило в MemCache c-tor.
код надежды достаточно понятен, но если нет, просто упомянем, что кэш передается функции перевода в качестве одного из его параметров c-tor. Он используется в свою очередь для генерации кэшированного вывода относительно вход.
надеюсь, что это помогает
посмотрите на bda.кэш http://pypi.python.org/pypi/bda.cache - использует ZCA и тестируется с zope и bfg.
keyring-Лучшая библиотека кэширования python. Вы можете использовать
keyring.set_password("service","jsonkey",json_res) json_res= keyring.get_password("service","jsonkey") json_res= keyring.core.delete_password("service","jsonkey")
Comments