diff options
| author | Fabien Pinckaers <fp@tinyerp.com> | 2009-12-01 09:26:50 +0100 |
|---|---|---|
| committer | Fabien Pinckaers <fp@tinyerp.com> | 2009-12-01 09:26:50 +0100 |
| commit | 90336e2e4e16de500c83db7aef8cd6a2a6678e00 (patch) | |
| tree | bfa4f205a17ce2f2c61052cfaa8c9c683b72bddd /addons/document_webdav/cache.py | |
| parent | 86794c725285c43083b1c807b92b250c34d16f24 (diff) | |
| parent | 96737d284fef562e8e6b096592d284aa6db8fa4a (diff) | |
merge
bzr revid: fp@tinyerp.com-20091201082650-e6n201rwss3u0etn
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 + |
