src/cm/utils/cache.py
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
child 261 b60ab54b6782
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.core.cache import cache
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
# adapted [to django] from http://code.activestate.com/recipes/325205/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
def dj_memoize(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
    def g(*args, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
        key = ( f.__name__, f, tuple(args), frozenset(kwargs.items()) )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
        val = cache.get(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
        if not val:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
            val = f(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
            cache.set(key,val)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
        return val
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
    return g
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
# adapted from http://code.activestate.com/recipes/496879/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
# decorator with LRU policy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
# changed : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
#  - default limit is 100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
#  - store sha1 of key (shorter) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
import cPickle, hashlib
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
def memoize(function, limit=100):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
    if isinstance(function, int):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        def memoize_wrapper(f):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
            return memoize(f, function)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
        return memoize_wrapper
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    dict = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    list = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    def memoize_wrapper(*args, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        key = hashlib.sha1(cPickle.dumps((args, kwargs))).digest()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
            list.append(list.pop(list.index(key)))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
        except ValueError:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
            dict[key] = function(*args, **kwargs)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
            list.append(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
            if limit is not None and len(list) > limit:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
                del dict[list.pop(0)]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        return dict[key]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    memoize_wrapper._memoize_dict = dict
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    memoize_wrapper._memoize_list = list
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    memoize_wrapper._memoize_limit = limit
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    memoize_wrapper._memoize_origfunc = function
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    memoize_wrapper.func_name = function.func_name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
    return memoize_wrapper