-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmemoize.py
66 lines (53 loc) · 1.73 KB
/
memoize.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import cPickle
import os
__all__ = ["memoize"]
cachedir = "pickles/"
if not os.path.exists(cachedir): os.mkdir(cachedir)
def persistent_memoize(func, limit=None):
if isinstance(func, int):
def memoize_wrapper(f):
return memoize(f, func)
return memoize_wrapper
file = os.path.join(cachedir, "%s.pickle" % func.func_name)
def memoize_wrapper(*args, **kwargs):
key = cPickle.dumps((args, kwargs))
if os.path.exists(file):
f = open(file)
c = cPickle.load(f)
f.close()
else:
c = {}
if c.has_key(key):
return c[key]
else:
c[key] = func(*args, **kwargs)
## pickle to disk
f = open(file, 'w')
cPickle.dump(c, f)
f.close()
## then return
return c[key]
return memoize_wrapper
def memoize(function, limit=None):
if isinstance(function, int):
def memoize_wrapper(f):
return memoize(f, function)
return memoize_wrapper
dict = {}
list = []
def memoize_wrapper(*args, **kwargs):
key = cPickle.dumps((args, kwargs))
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