Python 캐싱 라이브러리를 찾고 있지만 지금까지 아무것도 찾을 수 없습니다. dict
키와 만료 시간을 설정하고 다시 캐시 할 수 있는 간단한 인터페이스 가 필요합니다 . 다음과 같은 종류입니다.
cache.get(myfunction, duration=300)
캐시 항목이 있으면 캐시에서 항목을 제공하거나 함수를 호출하고 만료되지 않았거나 만료 된 경우 저장합니다. 이런 걸 아는 사람 있나요?
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)
get
메서드 만 구현하는 경우 dict 하위 클래스가 아니어야하며 포함 된 dict가있는 객체 여야합니다.
문제에 대한 간단한 해결책을 사용할 수 있습니다. 정말 간단하고 화려하지는 않습니다.
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 매개 변수 중 하나로 번역 함수를 전달하고 있습니다. 차례로 입력과 관련하여 캐시 된 출력을 생성하는 데 사용됩니다.
도움이되기를 바랍니다.
else
에 __getitem__
:)
else
에 __getitem__
? 그것이 그가 dict를 채우는 곳입니다 ...
redis를 사용해보십시오. 애플리케이션이 원자 적 방식으로 데이터를 공유하거나 웹 서버 플랫폼이있는 경우 가장 깨끗하고 쉬운 솔루션 중 하나입니다. 설정이 매우 쉽고 Python redis 클라이언트 http://pypi.python.org/pypi/redis 가 필요합니다 .
pypi 에서 gocept.cache 를 보고 시간 초과를 관리하십시오.
이 프로젝트 는 "인간을위한 캐싱"을 제공하는 것을 목표로합니다 (하지만 꽤 알려지지 않은 것처럼 보입니다).
프로젝트 페이지의 일부 정보 :
pip 설치 캐시
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()
bda.cache http://pypi.python.org/pypi/bda.cache를 보십시오-ZCA를 사용하고 zope 및 bfg로 테스트되었습니다.
keyring은 최고의 파이썬 캐싱 라이브러리입니다. 당신이 사용할 수있는
keyring.set_password("service","jsonkey",json_res)
json_res= keyring.get_password("service","jsonkey")
json_res= keyring.core.delete_password("service","jsonkey")
item
당신의 모범을 놓치고 있다고 생각합니다 .