diff options
| author | nch@tinyerp.com <> | 2009-12-08 09:45:17 +0530 |
|---|---|---|
| committer | nch@tinyerp.com <> | 2009-12-08 09:45:17 +0530 |
| commit | 3f9ed76869c572b42641e4e22e5435bb10fa5e46 (patch) | |
| tree | d957a2fe852c383a7c22148ccc15c20aff028d67 /addons/document_webdav/cache.py | |
| parent | d7a580e0bf1d031f3daa0bf657055ec50e307cfd (diff) | |
| parent | b1eb90aa06b4c74dd623f50f716b936a3b33a09a (diff) | |
[MERGE]
bzr revid: nch@tinyerp.com-20091208041517-n8932hvnsprkcme8
Diffstat (limited to 'addons/document_webdav/cache.py')
| -rw-r--r-- | addons/document_webdav/cache.py | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/addons/document_webdav/cache.py b/addons/document_webdav/cache.py new file mode 100644 index 00000000000..bc75114c4ae --- /dev/null +++ b/addons/document_webdav/cache.py @@ -0,0 +1,39 @@ +import time +import heapq + +def memoize(maxsize): + """decorator to 'memoize' a function - caching its results""" + def decorating_function(f): + cache = {} # map from key to value + heap = [] # list of keys, in LRU heap + cursize = 0 # because len() is slow + def wrapper(*args): + key = repr(args) + # performance crap + _cache=cache + _heap=heap + _heappop = heapq.heappop + _heappush = heapq.heappush + _time = time.time + _cursize = cursize + _maxsize = maxsize + if not _cache.has_key(key): + if _cursize == _maxsize: + # pop oldest element + (_,oldkey) = _heappop(_heap) + _cache.pop(oldkey) + else: + _cursize += 1 + # insert this element + _cache[key] = f(*args) + _heappush(_heap,(_time(),key)) + wrapper.misses += 1 + else: + wrapper.hits += 1 + return cache[key] + wrapper.__doc__ = f.__doc__ + wrapper.__name__ = f.__name__ + wrapper.hits = wrapper.misses = 0 + return wrapper + return decorating_function + |
