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)