单线程替代tqdm。
项目描述
ProgIter
ProgIter 允许您测量和打印迭代过程的进度。这可以通过迭代器接口或使用手动API来完成。使用迭代器接口是最常见的。
基本用法是
>>> from progiter import ProgIter
>>> for n in ProgIter(range(1000)):
>>> ... # do some work
基本ProgIter 是 非线程的。这使其与使用 线程 实现的 tqdm 和 rich.progress 区分开来。实现的选择有不同的权衡,两者都不是绝对优于另一个。非线程进度条提供同步无杂乱的日志记录,增加稳定性,并且——出人意料地——速度(由于Python的GIL)。同时,线程进度条更灵敏,能够同时更新多个stdout行,并且可以看起来更漂亮(除非您尝试将stdout记录到磁盘)。
ProgIter最初是独立于tqdm开发的,但该库的新版本已被设计为与tqdm-API兼容。ProgIter现在基本上是tqdm的替代品。在某些情况下,tqdm库可能更合适。ProgIter的主要优势是它不使用任何Python线程,因此在大量使用多进程的代码中可以更安全。这是因为线程在进程之前可能会在进程间重复锁,这可能导致死锁(尽管与tqdm一起,这种情况非常不可能)。
ProgIter比tqdm更简单,这可能适合某些应用。然而,这也意味着ProgIter不如tqdm可扩展。如果你需要漂亮的进度条或需要一些特殊功能,请使用tqdm(或rich);如果你需要默认情况下关于迭代的实用信息,请使用progiter。
在2.0版本中新增加了progiter.ProgressManager,它使得在无线程的ProgIter后端和线程化的RichProgIter后端之间切换几乎无缝。基本用法如下
from progiter.manager import ProgressManager
pman = ProgressManager()
with pman:
for item in pman.progiter(range(1000)):
... # do some work
以下gif展示了这一用法以及更复杂的用法
包级别文档可在以下位置找到:https://progiter.readthedocs.io/en/latest/
示例
ProgIter的基本用法简单直观:将Python可迭代对象包装起来。以下示例将一个range可迭代对象包装起来,并在迭代过程中消耗时向stdout报告进度。ProgIter对象接受各种关键字参数来修改进度测量和报告的细节。请参阅ProgIter类的API文档:https://progiter.readthedocs.io/en/latest/progiter.progiter.html#progiter.progiter.ProgIter
>>> from progiter import ProgIter
>>> def is_prime(n):
... return n >= 2 and not any(n % i == 0 for i in range(2, n))
>>> for n in ProgIter(range(1000), verbose=2):
>>> # do some work
>>> is_prime(n)
0.00% 0/1000... rate=0 Hz, eta=?, total=0:00:00
0.60% 6/1000... rate=76995.12 Hz, eta=0:00:00, total=0:00:00
100.00% 1000/1000... rate=266488.22 Hz, eta=0:00:00, total=0:00:00
对于更复杂的应用,有时可能需要手动使用ProgIter API。方法如下
>>> from progiter import ProgIter
>>> n = 3
>>> prog = ProgIter(desc='manual', total=n, verbose=3, time_thresh=0)
>>> prog.begin() # Manually begin progress iteration
>>> for _ in range(n):
... prog.step(inc=1) # specify the number of steps to increment
>>> prog.end() # Manually end progress iteration
manual 0.00% 0/3... rate=0 Hz, eta=?, total=0:00:00
manual 33.33% 1/3... rate=5422.82 Hz, eta=0:00:00, total=0:00:00
manual 66.67% 2/3... rate=8907.61 Hz, eta=0:00:00, total=0:00:00
manual 100.00% 3/3... rate=12248.15 Hz, eta=0:00:00, total=0:00:00
默认情况下,ProgIter旨在每两秒钟向stdout写一行,以最小化其开销并减少混乱。将其设置为零将强制其在每个迭代时打印。
在以可迭代或手动模式使用ProgIter时,您可以使用prog.ensure_newline方法确保您对stdout的下一个调用将从一个新行开始。您还可以使用prog.set_extra方法更新在格式化输出中显示的动态“额外”消息。以下示例演示了这一点。
>>> from progiter import ProgIter
>>> def is_prime(n):
... return n >= 2 and not any(n % i == 0 for i in range(2, n))
>>> _iter = range(1000)
>>> prog = ProgIter(_iter, desc='check primes', verbose=2, time_thresh=1e-3)
>>> for n in prog:
>>> if n == 97:
>>> print('!!! Special print at n=97 !!!')
>>> if is_prime(n):
>>> prog.set_extra('Biggest prime so far: {}'.format(n))
>>> prog.ensure_newline()
check primes 0.00% 0/1000... rate=0 Hz, eta=?, total=0:00:00
check primes 0.60% 6/1000...Biggest prime so far: 5 rate=79329.39 Hz, eta=0:00:00, total=0:00:00
!!! Special print at n=97 !!!
check primes 75.60% 756/1000...Biggest prime so far: 751 rate=272693.23 Hz, eta=0:00:00, total=0:00:00
check primes 99.30% 993/1000...Biggest prime so far: 991 rate=245852.75 Hz, eta=0:00:00, total=0:00:00
check primes 100.00% 1000/1000...Biggest prime so far: 997 rate=244317.84 Hz, eta=0:00:00, total=0:00:00
安装
可以通过pip轻松安装ProgIter。
pip install progiter
或者,ubelt库附带自己的ProgIter版本。请注意,ubelt版本的progiter是独立的(即ubelt实际上包含这个库的副本),但两个库通常保持同步。
项目细节
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发版本
progiter-2.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 155b17bf3f090c3791219a2fce37769c96852b38f62ea9baf9162c731e8870e4 |
|
MD5 | dd4cf8c7f0d6482245fa261db1b54a95 |
|
BLAKE2b-256 | 0242c7ea4b181feadb567ced59636ba72bfd307aa2a00d83c22e38b7d823fc3e |
progiter-2.0.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 66ab3aa88f804e969477ad9de52926a08c2d5b673d324132cfe1530888e26f10 |
|
MD5 | 09dfd71b0472f386beb9dc9452546895 |
|
BLAKE2b-256 | c4d5981d5651ecf71f47aeeecdb99b175daa1bfb2e157253e8c016a6515bf63e |