Ini adalah jawaban alternatif untuk kasus di mana tqdm_notebook tidak berfungsi untuk Anda.
Diberikan contoh berikut:
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)
Outputnya akan terlihat seperti ini (progres akan terlihat merah):
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
Masalahnya adalah bahwa output ke stdout dan stderr diproses secara tidak sinkron dan terpisah dalam hal baris baru.
Jika dikatakan Jupyter menerima pada stderr baris pertama dan kemudian "diproses" output pada stdout. Kemudian setelah menerima output pada stderr untuk memperbarui progres, ia tidak akan kembali dan memperbarui baris pertama karena hanya akan memperbarui baris terakhir. Sebaliknya harus menulis baris baru.
Solusi 1, menulis ke stdout
Satu solusi adalah dengan mengeluarkan keduanya ke stdout sebagai gantinya:
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)
Output akan berubah menjadi (tidak ada lagi merah):
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]
Di sini kita dapat melihat bahwa Jupyter tampaknya tidak jelas sampai akhir baris. Kita bisa menambahkan solusi lain dengan menambahkan spasi. Seperti:
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)
Yang memberi kita:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Solusi 2, tetapkan deskripsi
Mungkin secara umum lebih mudah untuk tidak memiliki dua output tetapi perbarui deskripsi, misalnya:
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)
Dengan output (deskripsi diperbarui saat sedang diproses):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Kesimpulan
Anda sebagian besar dapat membuatnya berfungsi dengan baik dengan tqdm polos. Tetapi jika tqdm_notebook berfungsi untuk Anda, cukup gunakan itu (tetapi Anda mungkin tidak akan membaca sejauh itu).
tqdm_notebook
, saya bahkan dapat melakukanprint
s normal , dan itu tidak mempengaruhi progress bar.