有Python缓存库吗?

有Python缓存库吗?,python,caching,Python,Caching,我正在寻找Python缓存库,但到目前为止找不到任何东西。我需要一个简单的dict-样的界面,在这里我可以设置密钥及其过期时间,并将它们恢复缓存。有点像: cache.get(myfunction, duration=300) 它将从缓存中获取项目(如果它存在),或者调用函数并存储它(如果它不存在或已过期)。有人知道这样的事情吗?看看烧杯: 我认为这是最流行的工具,但我自己没有使用过,也不确定它是否支持您需要的功能。导入时间 import time class CachedItem(

我正在寻找Python缓存库,但到目前为止找不到任何东西。我需要一个简单的
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()