Re: Memoization and encapsulation



In article <pan.2005.12.31.04.23.25.584823@xxxxxxxxxxxxxxxxxxxxxx>,
Steven D'Aprano <steve@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> I was playing around with simple memoization and came up with something
> like this:
>
> _cache = {}
> def func(x):
> global _cache

There's no need to declare _cache as global, since you're not assigning
to it. So this global isn't all that pesky after all...

> if _cache.has_key(x):
> return _cache[x]
> else:
> result = x+1 # or a time consuming calculation...
> _cache[x] = result
> return result
>
> when it hit me if I could somehow bind the cache to the function, I could
> get rid of that pesky global variable.
[ ... ]
> What do folks think? Is there a better way?

I actually prefer such a global variable to the default arg trick. The
idiom I generally use is:

_cache = {}
def func(x):
result = _cache.get(x)
if result is None:
result = x + 1 # or a time consuming calculation...
_cache[x] = result
return result

Just
.



Relevant Pages

  • Re: Memoization, files and Marshal?
    ... I changed the code to save it once every N misses, and made the cache update atomic to prevent problems with: ... end include Memoize module DumbFib def fibreturn n if n < 2 ...
    (comp.lang.ruby)
  • Re: WeakRef Hash
    ... > class WeakCache ... > def initialize(cache = Hash.new) ...
    (comp.lang.ruby)
  • Re: Bizarre behavior with mutable default arguments
    ... The caller might want to provide it's own pre-prepared cache. ... def foo: ... Global variables are rightly Considered Harmful. ...
    (comp.lang.python)
  • Re: memoize to a file
    ... I've made a file caching example using PSTore for my toy Memoizable library. ... This cache uses PStore to provide ... def initialize(path) ... def memoize(name, cache = Hash.new) ...
    (comp.lang.ruby)
  • Re: Memoization and encapsulation
    ... >> I was playing around with simple memoization and came up with something ... > * If cache hits are the norm, then a try/except version would be a bit ...
    (comp.lang.python)