annotate pylearn/dataset_ops/memo.py @ 832:67b92a42f86b

added dataset_ops
author James Bergstra <bergstrj@iro.umontreal.ca>
date Fri, 16 Oct 2009 12:04:05 -0400
parents
children 7ccce98da2b6
rev   line source
832
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
1 """Provide a decorator that caches expensive functions
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
2 """
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
3 import logging
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
4 _logger = logging.getLogger(__file__)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
5 info = _logger.info
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
6 def infop(*args):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
7 info(' '.join(str(a) for a in args))
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
8
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
9 def memo(f):
67b92a42f86b added dataset_ops
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
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
11 # construct a proper key.
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
12
67b92a42f86b added dataset_ops
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
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
14 # garbage collection
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
15 cache = {}
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
16 def rval(*args):
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
17 if args not in cache:
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
18 cache[args] = f(*args)
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
19 return cache[args]
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
20 rval.__name__ = 'memo@%s'%f.__name__
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
21 return rval
67b92a42f86b added dataset_ops
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff changeset
22