[python] Python 캐싱 라이브러리가 있습니까?

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)


답변

Memoize 데코레이터를 살펴볼 수도 있습니다 . 너무 많은 수정없이 원하는 작업을 수행 할 수 있습니다.


답변

Joblib https://joblib.readthedocs.io 는 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 데코레이터를 사용하는 것과 같은 멋진 작업을 수행 할 수도 있습니다. 문서는 여기에 있습니다 : https://joblib.readthedocs.io/en/latest/generated/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 '<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)