python progress bar
tqdm en el cuaderno Jupyter (3)
Esta es una respuesta alternativa para el caso donde tqdm_notebook no funciona para usted.
Dado el siguiente ejemplo:
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)
El resultado se vería así (el progreso se mostraría en rojo):
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
El problema es que la salida a stdout y stderr se procesan de forma asíncrona y por separado en términos de nuevas líneas.
Si digamos, Jupyter recibe en stderr la primera línea y luego la salida "procesada" en stdout. Luego, una vez que recibe una salida en stderr para actualizar el progreso, no volvería y actualizaría la primera línea, ya que solo actualizaría la última línea. En su lugar, tendrá que escribir una nueva línea.
Solución 1, escribir en stdout
Una solución alternativa sería generar ambos en stdout en su lugar:
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)
La salida cambiará a (no más rojo):
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]
Aquí podemos ver que Jupyter no parece despejarse hasta el final de la línea. Podríamos agregar otra solución para eso agregando espacios. Como:
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)
Lo que nos da:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Solución 2, establezca la descripción en su lugar
En general, podría ser más sencillo no tener dos salidas, sino actualizar la descripción, por ejemplo:
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)
Con la salida (descripción actualizada mientras se está procesando):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Conclusión
En su mayoría, puede hacer que funcione bien con tqdm simple. Pero si tqdm_notebook funciona para usted, simplemente use eso (pero probablemente no leería tan lejos).
Estoy usando
tqdm
para imprimir el progreso en un script que estoy ejecutando en un cuaderno Jupyter.
Estoy imprimiendo todos los mensajes en la consola a través de
tqdm.write()
.
Sin embargo, esto todavía me da una salida sesgada como esta:
Es decir, cada vez que se debe imprimir una nueva línea, se imprime una nueva barra de progreso en la siguiente línea. Esto no sucede cuando ejecuto el script a través de la terminal. ¿Como puedo resolver esto?
Intente usar
tqdm_notebook
lugar de
tqdm
, como se describe
here
.
Es experimental en esta etapa, pero funciona bastante bien en la mayoría de los casos.
Esto podría ser tan simple como cambiar su importación a:
from tqdm import tqdm_notebook as tqdm
¡Buena suerte!
EDITAR:
Después de probar, parece que
tqdm
realmente funciona bien en ''modo de texto'' en el cuaderno Jupyter.
Es difícil saberlo porque no ha proporcionado un
ejemplo mínimo
, pero parece que su problema es causado por una declaración de impresión en cada iteración.
La declaración de impresión está superando un número (~ 0.89) entre cada actualización de la barra de estado, lo que está desordenando la salida.
Intente eliminar la declaración de impresión.
Si los otros consejos aquí no funcionan y, al igual que yo, está utilizando la integración de
pandas
través de
progress_apply
, puede dejar que
tqdm
maneje:
from tqdm.auto import tqdm
tqdm.pandas()
df.progress_apply(row_function, axis=1)
El punto principal aquí radica en el módulo
tqdm.auto
.
Como se indica en
sus instrucciones de uso en los Portátiles IPython
, esto hace que
tqdm
elija entre los formatos de barra de progreso utilizados en los portátiles Jupyter y las consolas Jupyter, por una razón que aún carece de más investigaciones por mi parte, el formato específico elegido por
tqdm.auto
funciona sin problemas en
pandas
, mientras que todos los demás no lo hicieron, para el
progress_apply
se
progress_apply
específicamente.