added LRU caching of skiplist results
authorForrest Voight <forrest.voight@gmail.com>
Sat, 25 Aug 2012 05:59:38 +0000 (01:59 -0400)
committerForrest Voight <forrest@forre.st>
Tue, 18 Sep 2012 18:38:35 +0000 (14:38 -0400)
p2pool/util/memoize.py
p2pool/util/skiplist.py

index b5efab2..4199ccb 100644 (file)
@@ -1,3 +1,21 @@
+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()):
index 154edeb..d913128 100644 (file)
@@ -1,4 +1,4 @@
-from p2pool.util import math
+from p2pool.util import math, memoize
 
 class SkipList(object):
     def __init__(self, p=0.5):
@@ -9,6 +9,7 @@ class SkipList(object):
     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