Skip to content

Instantly share code, notes, and snippets.

@codysoyland
Created January 2, 2010 23:58
Show Gist options
  • Save codysoyland/267733 to your computer and use it in GitHub Desktop.
Save codysoyland/267733 to your computer and use it in GitHub Desktop.
import functools
class memoize(object):
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
return self.cache_get(args, lambda: self.func(*args))
def __get__(self, obj, objtype):
return self.cache_get(obj, lambda: self.__class__(functools.partial(self.func, obj)))
def cache_get(self, key, gen_callback):
try:
return self.cache[key]
except KeyError:
self.cache[key] = gen_callback()
return self.cache[key]
class Adder(object):
@memoize
def add(self, arg1, arg2):
print 'CALCULATING', arg1, '+', arg2
return arg1 + arg2
@memoize
def subtract(arg1, arg2):
print 'CALCULATING', arg1, '-', arg2
return arg1 - arg2
def main():
print subtract(10, 5)
print subtract(10, 5)
adder1 = Adder()
adder2 = Adder()
print adder1.add(5, 5)
print adder1.add(5, 5)
print adder2.add(5, 5)
print adder2.add(5, 5)
if __name__ == '__main__':
main()
@andrep
Copy link

andrep commented Sep 16, 2011 via email

@dpo
Copy link

dpo commented Sep 16, 2011

Thanks for the response. While trying to work this out I wrote my own, pieced together from various sources and my understanding of how things work. One thing I wanted to do is cache numpy arrays by computing their sha1 digest. My code is at https://gist.github.com/1222577. I'd be interested in any comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment