tqdm:提取时间已过去+剩余时间?

时间:2019-06-19 23:45:17

标签: python printing progress-bar iterable tqdm

我一直在浏览tqdm文档,但是无论我在哪里看,我都找不到一种方法来提取经过的时间和估计的剩余时间< / strong>字段(基本上是每行上进度条的中心:00:00<00:02)。

 0%|          | 0/200 [00:00<?, ?it/s]
  4%|▎         | 7/200 [00:00<00:02, 68.64it/s]
  8%|▊         | 16/200 [00:00<00:02, 72.87it/s]
 12%|█▎        | 25/200 [00:00<00:02, 77.15it/s]
 17%|█▋        | 34/200 [00:00<00:02, 79.79it/s]
 22%|██▏       | 43/200 [00:00<00:01, 79.91it/s]
 26%|██▌       | 52/200 [00:00<00:01, 80.23it/s]
 30%|███       | 61/200 [00:00<00:01, 82.13it/s]
....
100%|██████████| 200/200 [00:02<00:00, 81.22it/s]

tqdm的工作原理是在发生更新时实质上打印动态进度条,但是有一种方法可以“仅”打印00:0100:02部分,因此我可以使用它们在我的Python程序中的其他地方,例如在自动停止代码中,如果花费的时间太长,该过程会中止过程?

2 个答案:

答案 0 :(得分:1)

tqdm不会将该信息作为其公共API的一部分公开,我不建议您尝试将您自己的信息破解。然后,您将取决于tqdm的实现细节,该细节可能随时更改。

但是,这不应该阻止您编写自己的文章。使用计时器来检测循环很容易,如果花费的时间太长,则可以中止循环。这是一个快速,粗糙的示例,仍然使用tqdm提供视觉反馈:

import time
from tqdm import tqdm


def long_running_function(n, timeout=5):
    start_time = time.time()

    for _ in tqdm(list(range(n))):
        time.sleep(1)  # doing some expensive work...
        elapsed_time = time.time() - start_time
        if elapsed_time > timeout:
            raise TimeoutError("long_running_function took too long!")


long_running_function(100, timeout=10)

如果运行此命令,则该函数将在10秒后通过引发异常来停止其自身的执行。您可以在呼叫站点捕获此异常,然后以您认为合适的方式对其进行响应。


如果您想变得聪明一点,甚至可以在类似tqdm的包装中将其排除在外,如下所示:

def timed_loop(iterator, timeout):
    start_time = time.time()
    iterator = iter(iterator)

    while True:
        elapsed_time = time.time() - start_time
        if elapsed_time > timeout:
            raise TimeoutError("long_running_function took too long!")

        try:
            yield next(iterator)
        except StopIteration:
            pass


def long_running_function(n, timeout=5):
    for _ in timed_loop(tqdm(list(range(n))), timeout=timeout):
        time.sleep(0.1)


long_running_function(100, timeout=5)

答案 1 :(得分:0)

tqdm对象通过公共属性format_dict公开一些信息。

from tqdm import tqdm

with tqdm(total=100) as t:
    ...
    t.update()
    print(t.format_interval(t.format_dict['elapsed']))

否则,您可以解析str(t).split()