832
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
1 """Provide a decorator that caches expensive functions
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
2 """
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
3 import logging
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
4 _logger = logging.getLogger(__file__)
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
5 info = _logger.info
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
6 def infop(*args):
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
7 info(' '.join(str(a) for a in args))
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
8
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
9 def memo(f):
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
10 #TODO: support kwargs to rval. This requires looking up the names of f's parameters to
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
11 # construct a proper key.
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
12
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
13 #TODO: use weak references instead of a normal dict so that the cache doesn't prevent
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
14 # garbage collection
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
15 cache = {}
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
16 def rval(*args):
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
17 if args not in cache:
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
18 cache[args] = f(*args)
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
19 return cache[args]
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
20 rval.__name__ = 'memo@%s'%f.__name__
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
21 return rval
|
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
22
|