conditional computation

Fredrik Lundh fredrik at pythonware.com
Thu Oct 26 16:20:25 EDT 2006


robert wrote:

> I want to use a computation cache scheme like
> 
> 	o = CACHECOMPUTE  complex-key-expr  expensive-calc-expr 
> 
> frequently and elegantly without writing complex-key-expr or expensive-calc-expr twice.
> So its ugly:
> 
> 	_=complex-key-expr; o=cache.get(_) or cache.setdefault(_,expensive-calc-expr)
> 
> Any ideas?

in Python 2.5:

     cache = collections.defaultdict(lambda: expensive-calc-expr)
     value = cache[complex-key-expr]

or, if expensive-calc-expr needs access to the key:

     class mycache(dict):
         def __missing__(self, key):
             value = expensive-calc-expr(key)
             self[key] = value
             return value

     cache = mycache()
     value = cache[complex-key-expr]

or, if expensive-calc-expr needs access to more than just the key, or 
you need to run this on more than just 2.5:

     cache = {}

     key = complex-key-expr
     try:
         value = cache[key]
     except KeyError:
         value = cache[key] = expensive-calc-expr

</F>




More information about the Python-list mailing list