To jest alternatywna odpowiedź w przypadku, gdy tqdm_notebook nie działa dla Ciebie.
Biorąc pod uwagę następujący przykład:
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values)) as pbar:
for i in values:
pbar.write('processed: %d' %i)
pbar.update(1)
sleep(1)
Wynik będzie wyglądał mniej więcej tak (postęp byłby czerwony):
0%| | 0/3 [00:00<?, ?it/s]
processed: 1
67%|██████▋ | 2/3 [00:01<00:00, 1.99it/s]
processed: 2
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
processed: 3
Problem polega na tym, że dane wyjściowe do stdout i stderr są przetwarzane asynchronicznie i osobno pod względem nowych wierszy.
Jeśli powiedzmy, że Jupyter odbiera na stderr pierwszą linię, a następnie „przetworzone” wyjście na standardowe wyjście. Następnie, gdy otrzyma wyjście na stderr, aby zaktualizować postęp, nie wróci i nie zaktualizuje pierwszej linii, ponieważ zaktualizuje tylko ostatnią linię. Zamiast tego będzie musiał napisać nową linię.
Obejście 1, zapisywanie na standardowe wyjście
Jednym obejściem byłoby wyprowadzenie obu na standardowe wyjście:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Wynik zmieni się na (nie będzie już czerwony):
processed: 1 | 0/3 [00:00<?, ?it/s]
processed: 2 | 0/3 [00:00<?, ?it/s]
processed: 3 | 2/3 [00:01<00:00, 1.99it/s]
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Tutaj widzimy, że Jupyter nie wydaje się oczyścić do końca linii. Moglibyśmy dodać inne obejście tego problemu, dodając spacje. Jak na przykład:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
pbar.update(1)
sleep(1)
Co daje nam:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Obejście 2, zamiast tego ustaw opis
Ogólnie rzecz biorąc, prostsze może być nie posiadanie dwóch wyjść, ale zamiast tego zaktualizowanie opisu, np .:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.set_description('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Z wyjściem (opis aktualizowany podczas przetwarzania):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Wniosek
W większości przypadków można go sprawić, aby działał dobrze za pomocą zwykłego tqdm. Ale jeśli tqdm_notebook działa dla ciebie, po prostu go użyj (ale wtedy prawdopodobnie nie przeczytałeś aż tak daleko).
tqdm_notebook
, mogę nawet normalnie robićprint
i nie ma to wpływu na pasek postępu.