Python: Как заменить индикатор выполнения tqdm следующим во вложенном l oop? - PullRequest
1 голос
/ 30 марта 2020

Я использую модуль tqdm в ноутбуке Jupyter. И скажем, у меня есть следующий фрагмент кода с вложенным для l oop.

import time
from tqdm.notebook import tqdm

for i in tqdm(range(3)):
    for j in tqdm(range(5)):
        time.sleep(1)

Вывод выглядит так:

100%|██████████| 3/3 [00:15<00:00, 5.07s/it]
100%|██████████| 5/5 [00:10<00:00, 2.02s/it]

100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

Есть ли вариант, как показать только текущий j индикатор выполнения во время бега? Итак, окончательный результат после завершения итерации будет выглядеть так:

100%|██████████| 3/3 [00:15<00:00, 5.07s/it]
100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

Ответы [ 4 ]

1 голос
/ 02 апреля 2020

Спасибо @ michael-schroter за то, что обратили на это мое внимание, и @ jaroslav-bezděk за оригинальный пост.

Я бы предпочел ответ @ anton-pomieshchenko. Однако, как уже отмечалось, внутренняя панель продолжает исчезать и вновь появляться каждый раз, когда обновляется внешняя панель, что может выглядеть плохо, если это происходит быстро и часто.

Правильный ответ (при условии, что вам не нужно повторно использовать внешняя строка, но вы хотите повторно использовать внутреннюю):

from time import sleep
from tqdm.auto import tqdm

with tqdm(range(3)) as outer:
    inner_total = 3
    with tqdm(total=inner_total) as inner:
        for i in outer:
            inner.reset(inner_total)  # reinitialise without clearing
            for j in range(inner_total):
                sleep(1)
                inner.update()
            inner.refresh()  # print last state without clearing
1 голос
/ 02 апреля 2020

Вы можете использовать оставить параметр при создании индикатора выполнения. Как то так:

import time
from tqdm import tqdm

for i in tqdm(range(3)):
    for j in tqdm(range(5), leave=bool(i == 2)):
        time.sleep(1)
1 голос
/ 01 апреля 2020

Этого можно добиться, сбрасывая объект индикатора выполнения каждый раз перед запуском внутреннего l oop.

Попробуйте следующий код для достижения желаемых результатов.

import time
from tqdm.notebook import tqdm

#initializing progress bar objects
outer_loop=tqdm(range(3))
inner_loop=tqdm(range(5))

for i in range(len(outer_loop)):
    inner_loop.refresh()  #force print final state
    inner_loop.reset()  #reuse bar
    outer_loop.update() #update outer tqdm

    for j in range(len(inner_loop)):
        inner_loop.update() #update inner tqdm
        time.sleep(1)

Вывод :

Output

0 голосов
/ 02 апреля 2020

Пожалуйста, найдите измененный ответ от @ hamza-khurshid для трех циклов.

import time
from tqdm.auto import tqdm

#initializing progress bar objects
outer_loop=tqdm(range(3))
mid_loop=tqdm(range(5))
inner_loop=tqdm(range(7))


for i in range(len(outer_loop)):

    mid_loop.refresh()  #force print final state
    mid_loop.reset()  #reuse bar
    outer_loop.update() #update outer tqdm

    for j in range(len(mid_loop)):
        inner_loop.refresh()  #force print final state
        inner_loop.reset()  #reuse bar
        mid_loop.update()  ##update mid tqdm

        for k in range(len(inner_loop)):
            inner_loop.update() #update inner tqdm
            time.sleep(1)
print(i,j,k)

Пожалуйста, найдите результат ниже:

enter image description here

Это также ответ на вопрос по github

Спасибо и наилучшими пожеланиями

Майкл

...