memoize again

yota.news at gmail.com yota.news at gmail.com
Sat Nov 21 14:44:57 EST 2009


I spent a lot of time looking for tips on how to properly write
cache / memoize function.
Testing, merging and fixing contributed but half finished pieces of
code.
Here is the summary of what I learned through a clean example, might
it be useful for beginners.

#!/usr/bin/env python3.1 (should work in python 2.5)

def dcache(function) :
	""" simple, dict based cache """
	return memoize(function, cache={})

def ccache(cache = {}):
	""" with dict-like custom cache. Can be any class with
	at least __contains__, __setitem__ and  __getitem__ methods """
	def xcache(function):
		return memoize(function, cache=cache)
	return xcache

class memoize(object):
	def __init__(self, function, cache):
		self.function=function
		self.cache=cache

	def __get__(self, instance, cls=None):
		self.instance = instance
		return self

	def __call__(self, *args):
		if args not in self.cache:
			self.cache[args] = self.function(self.instance, *args)
		return self.cache[args]

which can be used as this:
- with the custom cache

@ccache(cache=customCache())
def compute(self, alpha, beta):
	return alpha + beta

- or with a default dict() cache

@dcache
def compute(self, alpha, beta):
	return alpha + beta

Each time compute() is called, the memoize decorator looks first into
the cache for a value whose key is the *args tuple.

The full content of the cache can be acessed as compute.cache.


~°



More information about the Python-list mailing list