optimized a few routines' time efficiency
authorForrest Voight <forrest@forre.st>
Thu, 29 Nov 2012 01:35:23 +0000 (20:35 -0500)
committerForrest Voight <forrest@forre.st>
Thu, 29 Nov 2012 01:35:23 +0000 (20:35 -0500)
p2pool/data.py
p2pool/node.py
p2pool/util/forest.py

index 44ddbc4..622b76f 100644 (file)
@@ -306,10 +306,12 @@ class Share(object):
         return gentx # only used by as_block
     
     def get_other_tx_hashes(self, tracker):
+        parents_needed = max(x['share_count'] for x in self.share_info['transaction_hash_refs']) if self.share_info['transaction_hash_refs'] else 0
         parents = tracker.get_height(self.hash) - 1
-        if not all(x['share_count'] <= parents for x in self.share_info['transaction_hash_refs']):
+        if parents < parents_needed:
             return None
-        return [tracker.items[tracker.get_nth_parent_hash(self.hash, x['share_count'])].share_info['new_transaction_hashes'][x['tx_count']] for x in self.share_info['transaction_hash_refs']]
+        last_shares = list(tracker.get_chain(self.hash, parents_needed + 1))
+        return [last_shares[x['share_count']].share_info['new_transaction_hashes'][x['tx_count']] for x in self.share_info['transaction_hash_refs']]
     
     def _get_other_txs(self, tracker, known_txs):
         other_tx_hashes = self.get_other_tx_hashes(tracker)
index 8e414c0..35f0dc1 100644 (file)
@@ -265,6 +265,8 @@ class Node(object):
             print
         
         def forget_old_txs():
+            print "KNOWN:", sum(bitcoin_data.tx_type.packed_size(tx) for tx in self.known_txs_var.value.itervalues())
+            print "MINING:", sum(bitcoin_data.tx_type.packed_size(tx) for tx in self.mining_txs_var.value.itervalues())
             new_known_txs = {}
             if self.p2p_node is not None:
                 for peer in self.p2p_node.peers.itervalues():
index 1cb2ba4..057c6b8 100644 (file)
@@ -59,6 +59,14 @@ def get_attributedelta_type(attrs): # attrs: {name: func}
         def from_element(cls, item):
             return cls(item.hash, item.previous_hash, **dict((k, v(item)) for k, v in attrs.iteritems()))
         
+        @staticmethod
+        def get_head(item):
+            return item.hash
+        
+        @staticmethod
+        def get_tail(item):
+            return item.previous_hash
+        
         def __init__(self, head, tail, **kwargs):
             self.head, self.tail = head, tail
             for k, v in kwargs.iteritems():
@@ -121,7 +129,7 @@ class TrackerView(object):
         ref = self._reverse_delta_refs[delta.tail]
         cur_delta = self._delta_refs[ref]
         assert cur_delta.tail == delta.tail
-        self._delta_refs[ref] = cur_delta - self._delta_type.from_element(item)
+        self._delta_refs[ref] = cur_delta - delta
         assert self._delta_refs[ref].tail == delta.head
         del self._reverse_delta_refs[delta.tail]
         self._reverse_delta_refs[delta.head] = ref
@@ -324,8 +332,9 @@ class Tracker(object):
     def get_chain(self, start_hash, length):
         assert length <= self.get_height(start_hash)
         for i in xrange(length):
-            yield self.items[start_hash]
-            start_hash = self._delta_type.from_element(self.items[start_hash]).tail
+            item = self.items[start_hash]
+            yield item
+            start_hash = self._delta_type.get_tail(item)
     
     def is_child_of(self, item_hash, possible_child_hash):
         height, last = self.get_height_and_last(item_hash)
@@ -342,9 +351,8 @@ class SubsetTracker(Tracker):
         self._subset_of = subset_of
     
     def add(self, item):
-        delta = self._delta_type.from_element(item)
         if self._subset_of is not None:
-            assert delta.head in self._subset_of.items
+            assert self._delta_type.get_head(item) in self._subset_of.items
         Tracker.add(self, item)
     
     def remove(self, item_hash):