|
- import time
-
- class MWT(object):
- """Memoize With Timeout"""
- _caches = {}
- _timeouts = {}
-
- def __init__(self,timeout=2):
- self.timeout = timeout
-
- def collect(self):
- """Clear cache of results which have timed out"""
- for func in self._caches:
- cache = {}
- for key in self._caches[func]:
- if (time.time() - self._caches[func][key][1]) < self._timeouts[func]:
- cache[key] = self._caches[func][key]
- self._caches[func] = cache
-
- def __call__(self, f):
- self.cache = self._caches[f] = {}
- self._timeouts[f] = self.timeout
-
- def func(*args, **kwargs):
- kw = sorted(kwargs.items())
- key = (args, tuple(kw))
- try:
- v = self.cache[key]
- print("cache")
- if (time.time() - v[1]) > self.timeout:
- raise KeyError
- except KeyError:
- print("new")
- v = self.cache[key] = f(*args,**kwargs),time.time()
- return v[0]
- func.func_name = f.__name__
-
- return func
|