Ai
5 Star 0 Fork 5

src-openEuler/python-progress
关闭

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
0001-fixup-moving-average-window.patch 3.89 KB
一键复制 编辑 原始数据 按行查看 历史
jiangxinyu 提交于 2022-11-16 17:20 +08:00 . update version to 1.6
From 8be91cee2d25e26ee1ab92a9bbab6fd9fda49104 Mon Sep 17 00:00:00 2001
From: jxy_git <jiangxinyu@kylinos.cn>
Date: Thu, 17 Nov 2022 11:26:05 +0800
Subject: [PATCH] fixup moving average window
---
MANIFEST.in | 1 -
progress/__init__.py | 78 +++++++++++++++++++++++++++++---------------
2 files changed, 52 insertions(+), 27 deletions(-)
diff --git a/MANIFEST.in b/MANIFEST.in
index ef7c4cb..0c73842 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,2 +1 @@
include README.rst LICENSE
-include test_*.py
diff --git a/progress/__init__.py b/progress/__init__.py
index b434b30..71b2039 100644
--- a/progress/__init__.py
+++ b/progress/__init__.py
@@ -18,10 +18,7 @@ from collections import deque
from datetime import timedelta
from math import ceil
from sys import stderr
-try:
- from time import monotonic
-except ImportError:
- from time import time as monotonic
+from time import time
__version__ = '1.6'
@@ -30,19 +27,55 @@ HIDE_CURSOR = '\x1b[?25l'
SHOW_CURSOR = '\x1b[?25h'
+class _Window(object):
+ max_seconds = 2
+ max_items = None
+
+ def __init__(self, max_seconds=2, max_items=None):
+ self.max_seconds = max_seconds
+ self.max_items = max_items
+
+ stamp = time()
+ self.last = stamp - 0.001
+ self.counter = 0
+ self.deque = deque()
+ self.next(0, stamp)
+
+ def pop(self):
+ item = self.deque.popleft()
+ self.counter -= item[1]
+
+ def clean(self):
+ if self.max_items:
+ while len(self.deque) > self.max_items:
+ self.pop()
+ while len(self.deque) > 2 and self.last - self.deque[0][0] > float(self.max_seconds):
+ self.pop()
+
+ def next(self, n, t):
+ self.clean()
+ self.deque.append((self.last, n))
+ self.last = t
+ self.counter += n
+
+ @property
+ def avg(self):
+ return self.counter / (self.last - self.deque[0][0])
+
+
class Infinite(object):
file = stderr
- sma_window = 10 # Simple Moving Average window
+ # Maximum number of next() calls to be held in Simple Moving Average
+ # window structure (in memory), default is unlimited.
+ sma_window_seconds = 2
+ sma_window = None
check_tty = True
hide_cursor = True
def __init__(self, message='', **kwargs):
self.index = 0
- self.start_ts = monotonic()
- self.avg = 0
- self._avg_update_ts = self.start_ts
- self._ts = self.start_ts
- self._xput = deque(maxlen=self.sma_window)
+ self.start_ts = time()
+ self.window = _Window(self.sma_window_seconds, self.sma_window)
for key, val in kwargs.items():
setattr(self, key, val)
@@ -67,23 +100,19 @@ class Infinite(object):
@property
def elapsed(self):
- return int(monotonic() - self.start_ts)
+ return int(time() - self.start_ts)
+
+ @property
+ def avg(self):
+ speed = self.window.avg
+ if speed:
+ return 1/speed
+ return 3600 # better constant?
@property
def elapsed_td(self):
return timedelta(seconds=self.elapsed)
- def update_avg(self, n, dt):
- if n > 0:
- xput_len = len(self._xput)
- self._xput.append(dt / n)
- now = monotonic()
- # update when we're still filling _xput, then after every second
- if (xput_len < self.sma_window or
- now - self._avg_update_ts > 1):
- self.avg = sum(self._xput) / len(self._xput)
- self._avg_update_ts = now
-
def update(self):
pass
@@ -116,10 +145,7 @@ class Infinite(object):
raise AttributeError(msg)
def next(self, n=1):
- now = monotonic()
- dt = now - self._ts
- self.update_avg(n, dt)
- self._ts = now
+ self.window.next(n, time())
self.index = self.index + n
self.update()
--
2.37.1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/python-progress.git
git@gitee.com:src-openeuler/python-progress.git
src-openeuler
python-progress
python-progress
master

搜索帮助