Rea*_*ggs 5 python progress-bar
当我尝试将 tqdm 用于嵌套循环时,循环会更新为新行。进度条在一个循环中运行良好。我正在运行 python 3.6.5。这是python版本兼容性的问题吗?如果这在 tqdm 中目前是不可能的,我将如何使用另一个模块来做到这一点?
我试过使用进度条模块,但它有同样的问题。
from tqdm import tqdm
from time import sleep
for i in tqdm(range(20), desc = 'sleeping'):
for j in tqdm(range(15), desc = 'inside', leave = False):
sleep(.1)
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
sleeping: 0%| | 0/20 [00:00<?, ?it/s]
inside: 0%| | 0/15 [00:00<?, ?it/s]
inside: 7%|????? | 1/15 [00:00<00:01, 9.94it/s]
inside: 13%|?????????? | 2/15 [00:00<00:01, 9.94it/s]
inside: 20%|??????????????? | 3/15 [00:00<00:01, 9.91it/s]
inside: 27%|???????????????????? | 4/15 [00:00<00:01, 9.88it/s]
inside: 33%|????????????????????????? | 5/15 [00:00<00:01, 9.86it/s]
inside: 40%|?????????????????????????????? | 6/15 [00:00<00:00, 9.84it/s]
inside: 47%|??????????????????????????????????? | 7/15 [00:00<00:00, 9.86it/s]
inside: 53%|???????????????????????????????????????? | 8/15 [00:00<00:00, 9.87it/s]
inside: 60%|????????????????????????????????????????????? | 9/15 [00:00<00:00, 9.88it/s]
inside: 67%|?????????????????????????????????????????????????? | 10/15 [00:01<00:00, 9.88it/s]
inside: 73%|??????????????????????????????????????????????????????? | 11/15 [00:01<00:00, 9.87it/s]
inside: 80%|???????????????????????????????????????????????????????????? | 12/15 [00:01<00:00, 9.86it/s]
inside: 87%|????????????????????????????????????????????????????????????????? | 13/15 [00:01<00:00, 9.85it/s]
inside: 93%|????????????????????????????????????????????????????????????????????? | 14/15 [00:01<00:00, 9.86it/s]
inside: 100%|??????????????????????????????????????????????????????????????????????????| 15/15 [00:01<00:00, 9.84it/s]
sleeping: 5%|???? | 1/20 [00:01<00:28, 1.52s/it]
Run Code Online (Sandbox Code Playgroud)
我预计这只会产生 2 个输出进度条。
关键是内部循环,tqdm(你的迭代器)也返回一个迭代器。您可以将其视为迭代器和进程栏的组合。
因此,当它耗尽时,下一个循环将创建一个新的 tqdm 迭代器,从而创建新行。
我的解决方案是不要使用 tqdm 作为迭代器,而只是将其用作进程栏。
outter_bar = tqdm(range(20), desc = 'sleeping')
outter_loop = range(20)
inner_bar = tqdm(range(15), desc = 'inside', leave = False)
inner_loop = range(15)
for i in outter_loop:
outter_bar.update(1)
for j in inner_loop:
inner_bar.update(1)
sleep(0.5)
inner_bar.reset()
Run Code Online (Sandbox Code Playgroud)
我在 jupyter 笔记本上测试了我的代码并且它有效。
希望有帮助!
PS:控制各种内循环
outter_loop = tqdm(range(2))
inner = [range(10), range(15)]
inner_bar = tqdm(None, total=10)
for i in outter_loop:
inner_bar.total = len(inner[i])
for _ in inner[i]:
sleep(0.5)
inner_bar.update(1)
inner_bar.reset()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3716 次 |
| 最近记录: |