有Python缓存库吗?
我正在寻找Python缓存库,但到目前为止找不到任何东西。我需要一个简单的有Python缓存库吗?,python,caching,Python,Caching,我正在寻找Python缓存库,但到目前为止找不到任何东西。我需要一个简单的dict-样的界面,在这里我可以设置密钥及其过期时间,并将它们恢复缓存。有点像: cache.get(myfunction, duration=300) 它将从缓存中获取项目(如果它存在),或者调用函数并存储它(如果它不存在或已过期)。有人知道这样的事情吗?看看烧杯: 我认为这是最流行的工具,但我自己没有使用过,也不确定它是否支持您需要的功能。导入时间 import time class CachedItem(
dict
-样的界面,在这里我可以设置密钥及其过期时间,并将它们恢复缓存。有点像:
cache.get(myfunction, duration=300)
它将从缓存中获取项目(如果它存在),或者调用函数并存储它(如果它不存在或已过期)。有人知道这样的事情吗?看看烧杯:
导入时间
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)
类CachedItem(对象):
定义初始化(self、key、value、duration=60):
self.key=key
自我价值=价值
self.duration=持续时间
self.timeStamp=time.time()
定义报告(自我):
返回“”%(self.key、self.value、time.time()+self.duration)
类CachedDict(dict):
def get(自身、密钥、fn、持续时间):
如果键不在self中\
或self[key]。时间戳+self[key]。持续时间<时间。时间()
打印“添加新值”
o=fn(键)
self[key]=CachedItem(key,o,duration)
其他:
打印“从缓存加载”
返回self[key]。值
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
fn=lambda key:“%s的值为None”%key
ci=CachedItem('a',12)
印刷词
cd=CachedDict()
打印cd.get('a',fn,5)
时间。睡眠(2)
打印cd.get('a',fn,6)
打印cd.get('b',fn,6)
时间。睡眠(2)
打印cd.get('a',fn,7)
打印cd.get('b',fn,7)
您还可以查看。你可能不需要太多的修改就可以让它做你想做的事情。看看pypi,管理超时。看看bda.cache-使用ZCA,并用zope和bfg进行测试。试试redis,它是应用程序以原子方式共享数据的最干净、最简单的解决方案之一,或者如果你有一些web服务器平台的话。它非常容易安装,您需要一个python 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参数之一传递一个转换函数。它反过来用于生成有关输入的缓存输出
希望对您有所帮助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 decorator等奇特功能。文档在这里:keyring是最好的python缓存库。你可以用
keyring.set_password("service","jsonkey",json_res)
json_res= keyring.get_password("service","jsonkey")
json_res= keyring.core.delete_password("service","jsonkey")
在Python3.2中,您可以使用functools库中的decorator。 它是最近使用的缓存,因此其中的项目没有过期时间,但作为一种快速攻击,它非常有用
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)
还没有人提到搁置 它不是memcached,但看起来更简单,可能适合您的需要。这旨在为“人类”提供缓存 (似乎还不太清楚)
项目页面中的一些信息: 装置 pip安装缓存 用法:
ExpiringDict是另一个选项:
我认为您的示例中缺少
项。是的,这可能需要一个键。。。以及,2.x.在同一流程内还是在流程之间共享?线程与否?它应该是线程安全的,对不起,我应该提到。我不需要在进程之间共享。试试:Apache2许可,100%覆盖,线程安全,进程安全,多个逐出策略和。这是行业标准,但我想要的只是一个简单的内存存储机制,可以容纳100个左右的密钥,而memcached有点过头了。不过,谢谢你的回答。啊,我一直在搜索这个,我只找到一个维基,上面提到了如何将它用作WSGI中间件。它看起来像我需要的,谢谢。另请看-据说是新的和改进的烧杯。我做了类似的事情,但你需要多线程锁和一个大小参数来避免它无限增长。然后需要一些函数按访问对键进行排序,以丢弃访问最少的键,等等。repr行不正确(应该使用self.timeStamp)。此外,它是一个糟糕的实现,对每个get()都进行不必要的计算。到期时间应该在CachedItem init中计算。事实上,如果您只实现get
方法,那么它不应该是dict子类,它应该是一个带有嵌入dict.+1的对象,用于建议简单的操作。根据问题的不同,它可能只是工作的工具。另外,你不需要\uuuu getitem\uuuuu
中的else
:)为什么他不需要\uu getitem\uuuuu
中的else
?他就是在那里写的,这很聪明。只要做一些更改,装饰器甚至可能在设定的时间后过期。您完全可以对装饰器中的缓存写入基于空间的限制。例如,如果希望函数逐项生成斐波那契序列,这将非常有用。您需要缓存,但只需要最后两个值-保存所有值只会占用空间。这是一个键环库,而不是缓存库。@StavrosKorokithakis实际上,我通过键环实现了键缓存作为旁注,joblib在处理大型NumPy阵列时非常出色,因为它有专门的方法来处理它们。为这些工具提供了一个很好的实现,它与python 2和python 3.big+1兼容,适用于cachetools。。。看起来很酷,还有一些缓存算法:)这绝对不应该被建议!保持兼容。@roboslone,从您关于线程不安全的评论开始两年(减去4天…),它可能已经改变了。我有cachetools 2.0。
import pylibmc
from cache import Cache
backend = pylibmc.Client(["127.0.0.1"])
cache = Cache(backend)
@cache("mykey")
def some_expensive_method():
sleep(10)
return 42
# writes 42 to the cache
some_expensive_method()
# reads 42 from the cache
some_expensive_method()
# re-calculates and writes 42 to the cache
some_expensive_method.refresh()
# get the cached value or throw an error
# (unless default= was passed to @cache(...))
some_expensive_method.cached()