This commit is contained in:
Giorgos Verigakis
2013-11-28 13:34:14 +08:00
parent 8b02a5b59f
commit 120b3e53b1
2 changed files with 26 additions and 41 deletions

View File

@@ -14,6 +14,7 @@
from __future__ import division from __future__ import division
from collections import deque
from datetime import timedelta from datetime import timedelta
from math import ceil from math import ceil
from sys import stderr from sys import stderr
@@ -25,12 +26,13 @@ __version__ = '1.1'
class Infinite(object): class Infinite(object):
file = stderr file = stderr
sma_window = 10
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.avg = 0
self.index = 0 self.index = 0
self.start_ts = time() self.start_ts = time()
self._ts = self.start_ts self._ts = self.start_ts
self._dt = deque(maxlen=self.sma_window)
for key, val in kwargs.items(): for key, val in kwargs.items():
setattr(self, key, val) setattr(self, key, val)
@@ -39,6 +41,10 @@ class Infinite(object):
return None return None
return getattr(self, key, None) return getattr(self, key, None)
@property
def avg(self):
return sum(self._dt) / len(self._dt) if self._dt else 0
@property @property
def elapsed(self): def elapsed(self):
return int(time() - self.start_ts) return int(time() - self.start_ts)
@@ -47,13 +53,6 @@ class Infinite(object):
def elapsed_td(self): def elapsed_td(self):
return timedelta(seconds=self.elapsed) return timedelta(seconds=self.elapsed)
def update_stats(self):
# Calculate moving average
now = time()
dt = now - self._ts
self.avg = (dt + self.index * self.avg) / (self.index + 1) if self.avg else dt
self._ts = now
def update(self): def update(self):
pass pass
@@ -64,8 +63,13 @@ class Infinite(object):
pass pass
def next(self, n=1): def next(self, n=1):
if n > 0:
now = time()
dt = (now - self._ts) / n
self._dt.append(dt)
self._ts = now
self.index = self.index + n self.index = self.index + n
self.update_stats()
self.update() self.update()
def iter(self, it): def iter(self, it):
@@ -76,12 +80,9 @@ class Infinite(object):
class Progress(Infinite): class Progress(Infinite):
backtrack = False
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(Progress, self).__init__(*args, **kwargs) super(Progress, self).__init__(*args, **kwargs)
self.max = kwargs.get('max', 100) self.max = kwargs.get('max', 100)
self.remaining = self.max
@property @property
def eta(self): def eta(self):
@@ -91,40 +92,24 @@ class Progress(Infinite):
def eta_td(self): def eta_td(self):
return timedelta(seconds=self.eta) return timedelta(seconds=self.eta)
def update_stats(self): @property
self.progress = min(1, self.index / self.max) def percent(self):
self.percent = self.progress * 100 return self.progress * 100
self.remaining = self.max - self.index
# Calculate moving average @property
now = time() def progress(self):
if self.delta: return min(1, self.index / self.max)
dt = (now - self._ts) / self.delta
self.avg = (dt + self.index * self.avg) / (self.index + 1) if self.avg else dt @property
self._ts = now def remaining(self):
return max(self.max - self.index, 0)
def start(self): def start(self):
self.delta = 0
self.update_stats()
self.update()
def next(self, n=1):
prev = self.index
self.index = min(self.index + n, self.max)
self.delta = self.index - prev
self.update_stats()
self.update() self.update()
def goto(self, index): def goto(self, index):
index = min(index, self.max) incr = index - self.index
delta = index - self.index self.next(incr)
if delta <= 0 and not self.backtrack:
return
self.index = index
self.delta = delta
self.update_stats()
self.update()
def iter(self, it): def iter(self, it):
try: try:

View File

@@ -32,7 +32,7 @@ for singleton in (Counter, Countdown, Stack, Pie):
sleep(0.03) sleep(0.03)
print() print()
bar = IncrementalBar('Random', backtrack=True, suffix='') bar = IncrementalBar('Random', suffix='%(index)d')
for i in range(100): for i in range(100):
bar.goto(randint(0, 100)) bar.goto(randint(0, 100))
sleep(0.1) sleep(0.1)