memoize IntType constructor
authorForrest Voight <forrest@forre.st>
Thu, 29 Nov 2012 19:02:57 +0000 (14:02 -0500)
committerForrest Voight <forrest@forre.st>
Fri, 30 Nov 2012 00:21:35 +0000 (19:21 -0500)
p2pool/util/memoize.py
p2pool/util/pack.py

index 4199ccb..bf0fafc 100644 (file)
@@ -37,3 +37,31 @@ def memoize_with_backing(backing, has_inverses=set()):
 
 def memoize(f):
     return memoize_with_backing({})(f)
+
+
+class cdict(dict):
+    def __init__(self, func):
+        dict.__init__(self)
+        self._func = func
+    
+    def __missing__(self, key):
+        value = self._func(key)
+        self[key] = value
+        return value
+
+def fast_memoize_single_arg(func):
+    return cdict(func).__getitem__
+
+class cdict2(dict):
+    def __init__(self, func):
+        dict.__init__(self)
+        self._func = func
+    
+    def __missing__(self, key):
+        value = self._func(*key)
+        self[key] = value
+        return value
+
+def fast_memoize_multiple_args(func):
+    f = cdict2(func).__getitem__
+    return lambda *args: f(args)
index 9037580..ad6eaf7 100644 (file)
@@ -2,6 +2,7 @@ import binascii
 import struct
 
 import p2pool
+from p2pool.util import memoize
 
 class EarlyEnd(Exception):
     pass
@@ -186,6 +187,7 @@ class StructType(Type):
     def write(self, file, item):
         return file, struct.pack(self.desc, item)
 
+@memoize.fast_memoize_multiple_args
 class IntType(Type):
     __slots__ = 'bytes step format_str max'.split(' ')