跳转到主要内容

单线程替代tqdm。

项目描述

GithubActions ReadTheDocs Pypi Downloads Codecov

ProgIter

ProgIter 允许您测量和打印迭代过程的进度。这可以通过迭代器接口或使用手动API来完成。使用迭代器接口是最常见的。

https://i.imgur.com/Jqfg8w0.gif

基本用法是

>>> from progiter import ProgIter
>>> for n in ProgIter(range(1000)):
>>>     ...  # do some work

基本ProgIter 是 非线程的。这使其与使用 线程 实现的 tqdmrich.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://i.imgur.com/GE1h3kr.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 (28.1 kB 查看哈希值)

上传时间 源代码

构建分发版本

progiter-2.0.0-py3-none-any.whl (24.9 kB 查看哈希值)

上传时间 Python 3

支持