+import itertools
+
+class LRUDict(object):
+ def __init__(self, n):
+ self.n = n
+ self.inner = {}
+ self.counter = itertools.count()
+ def get(self, key, default=None):
+ if key in self.inner:
+ x, value = self.inner[key]
+ self.inner[key] = self.counter.next(), value
+ return value
+ return default
+ def __setitem__(self, key, value):
+ self.inner[key] = self.counter.next(), value
+ while len(self.inner) > self.n:
+ self.inner.pop(min(self.inner, key=lambda k: self.inner[k][0]))
+
_nothing = object()
def memoize_with_backing(backing, has_inverses=set()):
-from p2pool.util import math
+from p2pool.util import math, memoize
class SkipList(object):
def __init__(self, p=0.5):
def forget_item(self, item):
self.skips.pop(item, None)
+ @memoize.memoize_with_backing(memoize.LRUDict(5))
def __call__(self, start, *args):
updates = {}
pos = start