tqdm:提取时间过去+剩余时间?
tqdm: extract time passed + time remaining?
我一直在查看 tqdm 文档,但无论我在哪里看,我都找不到一种方法来提取 已通过的时间 和估计的 剩余时间字段(基本上是每行进度条的中心: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
通过本质上在更新发生时打印动态进度条来工作,但是有没有办法 "just" 打印 00:01
和 00:02
部分,所以我可以在我的 Python 程序中的其他地方使用它们,例如在自动停止代码中,如果它花费的时间太长会停止进程?
编辑:请参阅下面库维护者的回答。事实证明,可以在 public API.
中获取此信息
tqdm
不会将该信息作为其 public 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)
tqdm
对象通过 public 属性 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()
您可以通过 format_dict
和一些计算得到 elapsed
和 remaining
时间。
t = tqdm(total=100)
...
elapsed = t.format_dict["elapsed"]
rate = t.format_dict["rate"]
remaining = (t.total - t.n) / rate if rate and t.total else 0 # Seconds*
我一直在查看 tqdm 文档,但无论我在哪里看,我都找不到一种方法来提取 已通过的时间 和估计的 剩余时间字段(基本上是每行进度条的中心: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
通过本质上在更新发生时打印动态进度条来工作,但是有没有办法 "just" 打印 00:01
和 00:02
部分,所以我可以在我的 Python 程序中的其他地方使用它们,例如在自动停止代码中,如果它花费的时间太长会停止进程?
编辑:请参阅下面库维护者的回答。事实证明,可以在 public API.
中获取此信息tqdm
不会将该信息作为其 public 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)
tqdm
对象通过 public 属性 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()
您可以通过 format_dict
和一些计算得到 elapsed
和 remaining
时间。
t = tqdm(total=100)
...
elapsed = t.format_dict["elapsed"]
rate = t.format_dict["rate"]
remaining = (t.total - t.n) / rate if rate and t.total else 0 # Seconds*