|
0
|
1 |
from django.core.cache import cache |
|
261
|
2 |
from hashlib import sha1 |
|
0
|
3 |
|
|
|
4 |
# adapted [to django] from http://code.activestate.com/recipes/325205/ |
|
|
5 |
def dj_memoize(f): |
|
|
6 |
def g(*args, **kwargs): |
|
261
|
7 |
key = sha1( str((f.__name__, f, tuple(args), frozenset(kwargs.items())) )).hexdigest() |
|
0
|
8 |
val = cache.get(key) |
|
|
9 |
if not val: |
|
|
10 |
val = f(*args, **kwargs) |
|
|
11 |
cache.set(key,val) |
|
|
12 |
return val |
|
|
13 |
return g |
|
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
|
17 |
# adapted from http://code.activestate.com/recipes/496879/ |
|
|
18 |
# decorator with LRU policy |
|
|
19 |
|
|
|
20 |
# changed : |
|
|
21 |
# - default limit is 100 |
|
|
22 |
# - store sha1 of key (shorter) |
|
|
23 |
import cPickle, hashlib |
|
|
24 |
|
|
|
25 |
def memoize(function, limit=100): |
|
|
26 |
if isinstance(function, int): |
|
|
27 |
def memoize_wrapper(f): |
|
|
28 |
return memoize(f, function) |
|
|
29 |
|
|
|
30 |
return memoize_wrapper |
|
|
31 |
|
|
|
32 |
dict = {} |
|
|
33 |
list = [] |
|
|
34 |
def memoize_wrapper(*args, **kwargs): |
|
|
35 |
key = hashlib.sha1(cPickle.dumps((args, kwargs))).digest() |
|
|
36 |
try: |
|
|
37 |
list.append(list.pop(list.index(key))) |
|
|
38 |
except ValueError: |
|
|
39 |
dict[key] = function(*args, **kwargs) |
|
|
40 |
list.append(key) |
|
|
41 |
if limit is not None and len(list) > limit: |
|
|
42 |
del dict[list.pop(0)] |
|
|
43 |
|
|
|
44 |
return dict[key] |
|
|
45 |
|
|
|
46 |
memoize_wrapper._memoize_dict = dict |
|
|
47 |
memoize_wrapper._memoize_list = list |
|
|
48 |
memoize_wrapper._memoize_limit = limit |
|
|
49 |
memoize_wrapper._memoize_origfunc = function |
|
|
50 |
memoize_wrapper.func_name = function.func_name |
|
|
51 |
return memoize_wrapper |