Skip to content

Instantly share code, notes, and snippets.

@rootux
Forked from jh0ker/mwt.py
Last active June 12, 2018 11:50
Show Gist options
  • Save rootux/06d1a63ce6038645c9cad4d3dc416027 to your computer and use it in GitHub Desktop.
Save rootux/06d1a63ce6038645c9cad4d3dc416027 to your computer and use it in GitHub Desktop.

Revisions

  1. rootux revised this gist Jun 12, 2018. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions mwt.py
    Original file line number Diff line number Diff line change
    @@ -29,11 +29,9 @@ def func(*args, **kwargs):
    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__
  2. @jh0ker jh0ker created this gist Nov 8, 2016.
    41 changes: 41 additions & 0 deletions mwt.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    #!/usr/bin/env python
    # Source: http://code.activestate.com/recipes/325905-memoize-decorator-with-timeout/#c1

    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