7 self.counter = itertools.count()
8 def get(self, key, default=None):
10 x, value = self.inner[key]
11 self.inner[key] = self.counter.next(), value
14 def __setitem__(self, key, value):
15 self.inner[key] = self.counter.next(), value
16 while len(self.inner) > self.n:
17 self.inner.pop(min(self.inner, key=lambda k: self.inner[k][0]))
21 def memoize_with_backing(backing, has_inverses=set()):
24 res = backing.get((f, args), _nothing)
25 if res is not _nothing:
30 backing[(f, args)] = res
31 for inverse in has_inverses:
32 backing[(inverse, args[:-1] + (res,))] = args[-1]
39 return memoize_with_backing({})(f)
43 def __init__(self, func):
47 def __missing__(self, key):
48 value = self._func(key)
52 def fast_memoize_single_arg(func):
53 return cdict(func).__getitem__
56 def __init__(self, func):
60 def __missing__(self, key):
61 value = self._func(*key)
65 def fast_memoize_multiple_args(func):
66 f = cdict2(func).__getitem__
67 return lambda *args: f(args)