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パラメータの1つとして変換関数が渡されます。次に、入力に関してキャッシュされた出力を生成するために使用されます。
それが役に立てば幸い
else
で__getitem__
:)
else
では__getitem__
?それは彼が
redisを試してください。これは、アプリケーションがアトミックな方法でデータを共有するための最もクリーンで簡単なソリューションの1つ、またはWebサーバープラットフォームがある場合に使用します。設定は非常に簡単です。Pythonredisクライアントhttp://pypi.python.org/pypi/redisが必要です。
見gocept.cacheは、PyPIには、タイムアウトを管理します。
このプロジェクトは、「人間のためのキャッシング」を提供することを目的としています(ただし、それはかなり不明なようです)。
プロジェクトページからの情報:
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でテストされています。
キーリングは最高のpythonキャッシングライブラリです。使用できます
keyring.set_password("service","jsonkey",json_res)
json_res= keyring.get_password("service","jsonkey")
json_res= keyring.core.delete_password("service","jsonkey")
item
あなたの例ではあなたが欠けていると思います。