From: Forrest Voight Date: Thu, 29 Nov 2012 01:35:23 +0000 (-0500) Subject: optimized a few routines' time efficiency X-Git-Tag: 9.2~2 X-Git-Url: https://git.novaco.in/?p=p2pool.git;a=commitdiff_plain;h=cb580b6676483c55778f3d78c56e6f8e3fbe8352 optimized a few routines' time efficiency --- diff --git a/p2pool/data.py b/p2pool/data.py index 44ddbc4..622b76f 100644 --- a/p2pool/data.py +++ b/p2pool/data.py @@ -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) diff --git a/p2pool/node.py b/p2pool/node.py index 8e414c0..35f0dc1 100644 --- a/p2pool/node.py +++ b/p2pool/node.py @@ -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(): diff --git a/p2pool/util/forest.py b/p2pool/util/forest.py index 1cb2ba4..057c6b8 100644 --- a/p2pool/util/forest.py +++ b/p2pool/util/forest.py @@ -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):