我正在寻找一个Python缓存库,但到目前为止找不到任何东西.我需要一个dict类似于简单的界面,我可以设置密钥及其过期,并让它们重新缓存.类似的东西:
cache.get(myfunction, duration=300)
Run Code Online (Sandbox Code Playgroud)
如果它存在,它将从缓存中提供该项目,或者如果它没有或已经过期,则调用该函数并存储它.有谁知道这样的事情?
小智 64
从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)
Run Code Online (Sandbox Code Playgroud)
j13*_*13r 14
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)
Run Code Online (Sandbox Code Playgroud)
你也可以做一些奇特的事情,比如在函数上使用@ memory.cache装饰器.文档在这里:http://packages.python.org/joblib/memory.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)
Run Code Online (Sandbox Code Playgroud)
尝试使用redis,它是应用程序以原子方式共享数据或者如果您有一些Web服务器平台的最简洁和最简单的解决方案之一.它很容易设置,你需要一个python redis客户端http://pypi.python.org/pypi/redis
小智 5
您可以使用我的简单解决方案来解决该问题。这真的很简单,没有花哨:
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]
Run Code Online (Sandbox Code Playgroud)
它确实缺乏到期功能,但是您可以通过在MemCache c-tor中指定特定规则来轻松扩展它。
希望代码是不言而喻的,但是,如果不是这样,就更不用说了,高速缓存正在作为其c-tor参数之一传递给翻译函数。依次用于生成有关输入的缓存输出。
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
97022 次 |
| 最近记录: |