get_pool_attempts_per_second improved from O(dist) to O(log dist)
authorForrest Voight <forrest@forre.st>
Sat, 6 Aug 2011 02:23:41 +0000 (22:23 -0400)
committerForrest Voight <forrest@forre.st>
Sat, 6 Aug 2011 02:23:41 +0000 (22:23 -0400)
p2pool/data.py

index b4f1eb1..10d26d9 100644 (file)
@@ -209,10 +209,10 @@ class Share(object):
 def get_pool_attempts_per_second(tracker, previous_share_hash, net, dist=None):
     if dist is None:
         dist = net.TARGET_LOOKBEHIND
-    # XXX could be optimized to use nth_parent and cumulative_weights
-    chain = list(itertools.islice(tracker.get_chain_to_root(previous_share_hash), dist))
-    attempts = sum(bitcoin_data.target_to_average_attempts(share.target) for share in chain[:-1])
-    time = chain[0].timestamp - chain[-1].timestamp
+    near = tracker.shares[previous_share_hash]
+    far = tracker.shares[tracker.get_nth_parent_hash(previous_share_hash, dist - 1)]
+    attempts = tracker.get_work(near.hash) - tracker.get_work(far.hash)
+    time = near.timestamp - far.timestamp
     if time == 0:
         time = 1
     return attempts//time