class Stats: def __init__(self): self.received = 0 self.sent = 0 self.exchanged_nodes = 0 self.transferred_blocks = 0 stats = Stats() def log_received(data): stats.received += len(data) def log_sent(data): stats.sent += len(data) def log_exchanged_node(k=1): stats.exchanged_nodes += k def log_transferred_block(k=1): stats.transferred_blocks += k def reset(): global stats stats = Stats() def report(): return """received {rf} ({r:,} B) sent {sf} ({s:,} B) exchanged {nodes:,} hash tree nodes transferred {blocks:,} blocks""".format( rf=format_bytes(stats.received), r=stats.received, sf=format_bytes(stats.sent), s=stats.sent, nodes=stats.exchanged_nodes, blocks=stats.transferred_blocks ) def format_bytes(x): exts = ["B", "kiB", "MiB", "GiB", "TiB", "PiB"] i = 0 while x>1024: x /= 1024 i += 1 if x>=100: x = round(x) elif x>=10: x = round(x, 1) else: x = round(x, 2) return "{0} {1}".format(x, exts[i])