src/cm/utils/cache.py
changeset 0 40c8f766c9b8
child 261 b60ab54b6782
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/cache.py	Mon Nov 23 15:14:29 2009 +0100
@@ -0,0 +1,50 @@
+from django.core.cache import cache
+
+# adapted [to django] from http://code.activestate.com/recipes/325205/
+def dj_memoize(f):
+    def g(*args, **kwargs):
+        key = ( f.__name__, f, tuple(args), frozenset(kwargs.items()) )
+        val = cache.get(key)
+        if not val:
+            val = f(*args, **kwargs)
+            cache.set(key,val)
+        return val
+    return g
+
+
+
+# adapted from http://code.activestate.com/recipes/496879/
+# decorator with LRU policy
+
+# changed : 
+#  - default limit is 100
+#  - store sha1 of key (shorter) 
+import cPickle, hashlib
+
+def memoize(function, limit=100):
+    if isinstance(function, int):
+        def memoize_wrapper(f):
+            return memoize(f, function)
+
+        return memoize_wrapper
+
+    dict = {}
+    list = []
+    def memoize_wrapper(*args, **kwargs):
+        key = hashlib.sha1(cPickle.dumps((args, kwargs))).digest()
+        try:
+            list.append(list.pop(list.index(key)))
+        except ValueError:
+            dict[key] = function(*args, **kwargs)
+            list.append(key)
+            if limit is not None and len(list) > limit:
+                del dict[list.pop(0)]
+
+        return dict[key]
+
+    memoize_wrapper._memoize_dict = dict
+    memoize_wrapper._memoize_list = list
+    memoize_wrapper._memoize_limit = limit
+    memoize_wrapper._memoize_origfunc = function
+    memoize_wrapper.func_name = function.func_name
+    return memoize_wrapper