我正在寻找一个Python缓存库,但到目前为止找不到任何东西.我需要一个dict
类似于简单的界面,我可以设置密钥及其过期,并让它们重新缓存.类似的东西:
cache.get(myfunction, duration=300)
如果它存在,它将从缓存中提供该项目,或者如果它没有或已经过期,则调用该函数并存储它.有谁知道这样的事情?
从Python 3.2中,您可以使用functools库中的装饰器@lru_cache.它是最近使用的缓存,因此其中的项目没有到期时间,但作为快速入侵它非常有用.
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)
看看Beaker:
主页
缓存文档
关于将Beaker与Django一起使用的好快速入门文章(但在任何其他应用程序中也很有用)
您还可以查看Memoize装饰器.你可以在没有太多修改的情况下让它做你想做的事.
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,但看起来更简单,可能适合您的需要.
我认为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 '' % (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,它是应用程序以原子方式共享数据或者如果您有一些Web服务器平台的最简洁和最简单的解决方案之一.它很容易设置,你需要一个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]
它确实缺乏到期功能,但是您可以通过在MemCache c-tor中指定特定规则来轻松扩展它。
希望代码是不言而喻的,但是,如果不是这样,就更不用说了,高速缓存正在作为其c-tor参数之一传递给翻译函数。依次用于生成有关输入的缓存输出。
希望能帮助到你