นี่เป็นคำตอบทางเลือกสำหรับกรณีที่tqdm_notebook ใช้ไม่ได้สำหรับคุณ
ให้ตัวอย่างต่อไปนี้:
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)
ผลลัพธ์จะมีลักษณะดังนี้ (ความคืบหน้าจะแสดงเป็นสีแดง):
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
ปัญหาคือเอาต์พุตไปยังstdoutและstderrถูกประมวลผลแบบอะซิงโครนัสและแยกกันในรูปแบบของบรรทัดใหม่
ถ้าบอกว่า Jupyter ได้รับบน stderr บรรทัดแรกแล้วเอาต์พุต "ประมวลผล" บน stdout จากนั้นเมื่อได้รับเอาต์พุตบน stderr เพื่ออัปเดตความคืบหน้ามันจะไม่ย้อนกลับไปอัปเดตบรรทัดแรกเนื่องจากจะอัปเดตบรรทัดสุดท้ายเท่านั้น แต่จะต้องเขียนบรรทัดใหม่
วิธีแก้ปัญหาเบื้องต้น 1 เขียนถึง stdout
วิธีแก้ปัญหาอย่างหนึ่งคือการส่งออกทั้งคู่เป็น stdout แทน:
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)
ผลลัพธ์จะเปลี่ยนเป็น (ไม่มีสีแดงอีกต่อไป):
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]
ที่นี่เราจะเห็นว่า Jupyter ดูเหมือนจะไม่ชัดเจนจนกว่าจะถึงจุดสิ้นสุดของบรรทัด เราสามารถเพิ่มวิธีแก้ปัญหาอื่นได้โดยการเพิ่มช่องว่าง เช่น:
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)
ซึ่งทำให้เรา:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
วิธีแก้ปัญหา 2 ตั้งค่าคำอธิบายแทน
โดยทั่วไปแล้วมันอาจจะตรงไปตรงมามากกว่าที่จะไม่มีเอาต์พุตสองเอาต์พุต แต่อัปเดตคำอธิบายแทนเช่น:
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)
ด้วยผลลัพธ์ (คำอธิบายอัปเดตขณะกำลังประมวลผล):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
สรุป
คุณสามารถทำให้มันทำงานได้ดีด้วย tqdm ธรรมดา แต่ถ้าtqdm_notebookเหมาะกับคุณให้ใช้สิ่งนั้น (แต่คุณอาจจะไม่อ่านไกลขนาดนั้น)
tqdm_notebook
ฉันยังทำprint
s ปกติได้ด้วยและมันไม่มีผลกับแถบความคืบหน้า