Ответ 1
Взгляните на Beaker:
Я ищу библиотеку кэширования Python, но пока ничего не могу найти. Мне нужен простой dict
-образный интерфейс, где я могу установить ключи и их истечение и вернуть их в кеширование. Что-то вроде:
cache.get(myfunction, duration=300)
который даст мне элемент из кеша, если он существует, или вызовет функцию и сохранит ее, если она не указана или истекла. Кто-нибудь знает что-то подобное?
Взгляните на Beaker:
Из 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 decorator. Вероятно, вы можете заставить его делать то, что хотите, без особых изменений.
Joblib http://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.cache на функциях. Документация находится здесь: http://packages.python.org/joblib/memory.html
Никто еще не упомянул о полке. https://docs.python.org/2/library/shelve.html
Он не memcached, но выглядит намного проще и может соответствовать вашим потребностям.
Я думаю, что API-интерфейс python memcached является распространенным инструментом, но я не использовал его сам и не уверен, поддерживает ли он функции вам нужно.
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 redis http://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]
У него действительно нет функциональности истечения срока действия, но вы можете легко расширить его, указав определенное правило в c-tor MemCache.
Код надежды достаточно понятен, но если нет, то просто, чтобы упомянуть, этот кеш передается функцией перевода как один из его параметров c-tor. Он использовал, в свою очередь, для генерации кэшированного вывода относительно ввода.
Надеюсь, что это поможет
Посмотрите на gocept.cache
Посмотрите на bda.cache 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")