Barras de progreso en Python: Una guía completa con ejemplos
Aprende a crear barras de progreso en Python utilizando tqdm, progressbar2, alive-progress y Tkinter, con las mejores prácticas para mejorar la UX y el rendimiento de la aplicación.
En las aplicaciones actuales, los usuarios quieren una respuesta inmediata, especialmente cuando las tareas tardan mucho en completarse. Las barras de progreso de Python son una forma clara y sencilla de mostrar que algo está ocurriendo en segundo plano. Una barra de progreso sólida ayuda a que un programa parezca más rápido, añade un toque profesional y mejora la facilidad de uso.
En este artículo, aprenderás a implementar barras de progreso en Python utilizando bibliotecas populares como tqdm, progress, progressbar2, alive-progress, y Tkinter, junto con las mejores prácticas para mejorar la experiencia del usuario y el rendimiento de la aplicación.
Las barras de progreso son omnipresentes. Suelen utilizarse para descargas de archivos, instalaciones de software y canalizaciones ETL. También son útiles para seguir el progreso del entrenamiento de modelos de machine learning.
La barra de progreso muestra cuánto de una tarea se ha completado y cuánto queda. Puede aparecer como texto en una interfaz de línea de comandos (CLI) o como una barra visual en una interfaz gráfica de usuario (GUI).
Las barras de progreso mejoran la experiencia del usuario. Proporcionan actualizaciones en tiempo real, mostrando a los usuarios su progreso en el proceso. Si se produce un retraso, los usuarios pueden decidir si intervienen o esperan. Esta visibilidad reduce la frustración y hace que los tiempos de espera parezcan más cortos. Los usuarios no se quedarán mirando una pantalla estática, preguntándose si está pasando algo; seguirán participando y se sentirán seguros de que se está avanzando.
Los programadores utilizan barras de progreso para controlar el rendimiento de la aplicación. Ayudan a identificar los cuellos de botella, comparar el código y hacer un seguimiento de la duración de las tareas. Las barras de progreso en guiones y flujos de trabajo muestran actualizaciones de estado claras. Ayudan a los usuarios a comprender mejor los procesos de larga duración. También mejoran la usabilidad de las herramientas interactivas y los cuadernos.
Las barras de progreso también pueden servir como una forma sencilla de supervisión del rendimiento. Muestran cuánto tiempo lleva cada tarea. Esto ayuda a los programadores a detectar las fases lentas y a medir la eficacia. Esto permite comparar fácilmente diferentes implementaciones.
Barras de progreso de la línea de comandos
Las barras de progreso de la línea de comandos proporcionan información visual sobre las tareas de larga duración directamente en el terminal, haciendo que los scripts sean más informativos y fáciles de usar. Python ofrece varias bibliotecas, cada una con puntos fuertes en velocidad, personalización y estilo visual. Examinaremos cuatro de ellos: tqdm, progress, progressbar2, y alive-progress.
Tqdm: la norma en rapidez y sencillez
tqdm es una popular biblioteca de Python para crear barras de progreso. Proporciona indicadores de progreso rápidos y versátiles para bucles e iterables. Realiza un seguimiento de las iteraciones y calcula tanto el tiempo restante como el tiempo transcurrido. Esta información actualiza la barra en tiempo real. tqdm funciona en segundo plano. Predice cuánto tiempo queda y omite las actualizaciones que no son necesarias. Es fácil de aprender, consume poca memoria y está respaldado por una sólida comunidad.
Proceso de instalación
Una forma fácil de instalar tqdm es utilizar el instalador de pip. Escribe el siguiente comando desde el terminal.
tqdm es fácil de usar. Importa la biblioteca. Envuelve cualquier iterable con tqdm(iterable) para mostrar una barra de progreso.
En lugar de escribir tqdm(range(n)), puedes utilizar la abreviatura trange(n) por comodidad.
from tqdm import trange
import time
for _ in trange(100, desc="Processing"):# Do stuff here
time.sleep(0.05)# simulate a taskCon la tecnología de
Este código produce una barra de progreso en vivo durante la ejecución.
La barra de progreso muestra
Porcentaje completado (22%)
Número de iteraciones completadas sobre el total (224/1000)
Tiempo transcurrido y tiempo restante estimado (12 segundos transcurridos, 42 segundos restantes)
Iteraciones por segundo (18,09 it/s).
Para añadir una descripción a la barra de progreso, especifica la opción desc.
for i in trange(1000, desc='Processing'):# description# Simulate a task
time.sleep(0.05)Con la tecnología de
Barras de progreso anidadas
Las barras de progreso anidadas en tqdm te ayudan a seguir el progreso en varios bucles. También son útiles cuando necesitas hacer un seguimiento de varias etapas de trabajo. Algunos ejemplos son el procesamiento por lotes, los bucles anidados y el entrenamiento de modelos.
Envuelve cada bucle en un bucle anidado con tqdm. Utiliza los argumentos posición y dejar para controlar cómo aparecen.
position: Establece la posición vertical de cada barra de progreso. posición=0 es la barra superior, posición=1 aparece debajo, y así sucesivamente.
leave: Si leave=Verdadero, la barra de progreso permanece en pantalla después de que termine. Si leave=False, desaparece para evitar el desorden.
for i in trange(3, desc='Outer loop', leave=True):for j in trange(5, desc='Inner loop', leave=False):for j in trange(4, desc='Inner inner loop', leave=False):
time.sleep(0.05)Con la tecnología de
Las barras de progreso anidadas muestran una jerarquía clara. Te ayudan a visualizar las distintas fases de una tarea. Proporcionan información detallada a varios niveles. Esto ayuda a los programadores a identificar ralentizaciones o cuellos de botella con facilidad.
Integración de Pandas
Tqdm se integra bien con pandas. Proporciona una forma sencilla de añadir barras de progreso a las tareas de DataFrame y series. Muestra el progreso en tiempo real de funciones como apply, groupby, y map. Estas funciones pueden ser lentas con grandes conjuntos de datos.
Para activar esta función, llama a tqdm.pandas(). A continuación, utiliza progress_apply en lugar del método habitual de pandas apply. Esto mostrará una barra de progreso a medida que tu función recorra filas o columnas. Verás el progreso de la operación sin reescribir tu código.
En el siguiente programa, creamos un DataFrame con una columna llamada "números". Esta columna contiene números enteros de 0 a 1000. A continuación, generamos una nueva columna aplicando una operación "lenta" llamada slow_squared.
En lugar de utilizar la función estándar pandas apply, utilizamos progress_apply de tqdm. Aparece una barra de progreso durante la operación. Proporciona actualizaciones en tiempo real sobre el grado de procesamiento completado.
import pandas as pd
from tqdm import tqdm
import time
# Simulate a time-consuming operationdefslow_square(x):
time.sleep(0.01)return x**2# Create a sample DataFrame
df = pd.DataFrame({'numbers':range(1000)})# Initialize tqdm for pandas
tqdm.pandas(desc="Processing")# Use progress_apply instead of apply
df['slow_squared']= df['numbers'].progress_apply(slow_square)# Print the resultprint(df.head())Con la tecnología de
El resultado del código es el siguiente
Podemos utilizar progress_apply para otras operaciones de DataFrame como groupby.
grouped = df.groupby('numbers').progress_apply(lambda g: g.sum())Con la tecnología de
Opciones de personalización
Tqdm te permite personalizar las barras de progreso para adaptarlas a distintos entornos y necesidades de los usuarios. Puedes ajustar la anchura con ncols. La página bar_format argument te ofrece un control total sobre la disposición del texto. Además, si configuras dynamic_ncols=True, la barra se redimensionará automáticamente para ajustarse al terminal.
Consideraciones de rendimiento específicas de la tqdm
Tqdm es rápido y ligero. Añade poca sobrecarga, incluso en bucles rápidos. Puedes desactivar las barras de progreso con disable=True. Esto es útil en entornos de producción donde el rendimiento es clave. Para bucles rápidos, actualizar la barra cada vez puede ser demasiado. Por eso, tqdm te permite controlar la frecuencia con la que se actualiza. Puedes utilizar parámetros como mininterval y maxinterval.
Progreso: Estilos y giros personalizables
En Progreso de Python te permite crear fácilmente barras de progreso basadas en texto para la línea de comandos. Cuenta con una API sencilla. Admite barras de progreso y spinners y permite una personalización básica de la salida. Es pequeño, rápido y no tiene dependencias. Esto lo hace ideal para guiones rápidos y configuraciones sencillas.
La biblioteca progress incluye siete estilos integrados de barras de progreso: Barra, Barra de carga, Barra de relleno de cuadrados, Barra de relleno de círculos, Barra incremental, Barra de píxeles y Barra de sombra.
Para utilizarlo, importa el estilo deseado, instala una variable, utiliza .next() en el bucle y .finish() una vez finalizado el proceso. Por ejemplo, para utilizar una ChargingBar, utiliza el siguiente código.
import time
from progress.bar import ChargingBar
bar = ChargingBar('Processing',max=20)for i inrange(20):# Do some work
time.sleep(0.5)
bar.next()
bar.finish()
`Con la tecnología de
Progress también incluye giradores para tareas de duración desconocida. El código para implementar un spinner es sencillo.
import time
from progress.spinner import Spinner
spinner = Spinner('Processing... ')# Spinner during a task of unknown duration.for _ inrange(50):# Do stuff
time.sleep(0.1)# simulate a running task
spinner.next()
spinner.finish()Con la tecnología de
Este código da como resultado la descripción ("Procesando...") seguida de un spinner.
La biblioteca de progreso es sencilla y ligera, pero tiene algunas limitaciones que debes tener en cuenta. No es compatible con los cuadernos Jupyter, y no puede redimensionarse dinámicamente. Además, ofrece menos opciones de personalización que bibliotecas como tqdm. Funciona bien para tareas básicas de línea de comandos, pero puede tener problemas con trabajos complejos o de alto rendimiento.
Barra de progreso2: Personalización y compatibilidad mejoradas
Barra de progreso2 es una potente biblioteca de Python. Te ayuda a crear barras de progreso flexibles y personalizables para aplicaciones de línea de comandos. Tiene muchos widgets, como porcentaje, ETA, marcadores animados y contadores. Esto lo hace ideal para tareas CLI más complejas o pulidas.
Progressbar2 ofrece más opciones de control y formato que las bibliotecas más sencillas como progress. También funciona mejor con el registro y los flujos de trabajo multihilo.
La clase ProgressBar de progressbar2 muestra el estado de progreso actual. Lo hace con un conjunto de widgets personalizables.
Un widget es una pieza modular que se actualiza en función del estado de la barra de progreso. Esto incluye el porcentaje completado, el tiempo transcurrido y el tiempo estimado restante.
Puedes elegir entre muchos tipos de widgets. Incluyen etiquetas de texto, marcadores de progreso, contadores, temporizadores, rotadores y formateadores personalizados. Esta variedad te permite personalizar el aspecto y la función de la barra para tu aplicación.
El uso básico de Progressbar2 es bastante sencillo.
import time
import progressbar
for i in progressbar.progressbar(range(1000)):
time.sleep(0.02)Con la tecnología de
La salida muestra el porcentaje completado, las iteraciones completadas/iteraciones totales, el tiempo transcurrido y el tiempo restante estimado.
Las bibliotecas de barras de progreso suelen basarse en la actualización de una sola línea en el terminal mediante retornos de carro (\r). Esto significa que las declaraciones normales de print() pueden interferir empujando la barra hacia abajo o corrompiendo su salida. La biblioteca progressbar2 proporciona una forma segura de imprimir mensajes sin interferir con la barra de progreso.
import time
import progressbar
bar = progressbar.ProgressBar(redirect_stdout=True)for i inrange(10):# Do some task
time.sleep(0.1)# Print statementprint(f'Loop #{i}')
bar.update(i)Con la tecnología de
La biblioteca progressbar2 ofrece una amplia personalización a través de su sistema modular de widgets. Los widgets muestran detalles en la barra de progreso, como el porcentaje completado, el tiempo transcurrido, el tiempo restante estimado, contadores o animaciones de la barra. Puedes mezclar y combinar estos widgets para crear una barra de progreso personalizada. Por ejemplo, puedes mostrar el porcentaje y el tiempo estimado de llegada. También puedes añadir más detalles, como nombres de archivo, marcas de tiempo o giros.
import time
import progressbar
# Define a custom set of widgets
widgets =['Progress: ',# Description text
progressbar.Percentage(),# Show percentage completed' ',
progressbar.Bar(marker=':'),# Custom bar with specified marker' ',
progressbar.ETA(),# Estimated time remaining' | ',
progressbar.Timer(),# Time elapsed]# Initialize the progress bar with widgets
bar = progressbar.ProgressBar(widgets=widgets, max_value=50)# Taskfor i inrange(50):# Do stuff
time.sleep(0.1)# Simulate task
bar.update(i +1)Con la tecnología de
Alive-progress: animaciones dinámicas para terminales modernos
Alive-progress muestra barras de progreso animadas que cambian en tiempo real. Esto da a las aplicaciones de línea de comandos un aspecto moderno y sensible. La barra avanza y muestra útiles métricas en tiempo real. Muestra el porcentaje completado, el tiempo transcurrido, el tiempo estimado restante y la velocidad de iteración. Esto la hace atractiva e informativa.
Alive-progress tiene la capacidad de mostrar y gestionar varias barras de progreso simultáneamente.
from alive_progress import alive_bar
import time
import threading
# Simulate a taskdefsimulate_task(name, total):with alive_bar(total, title=name)as bar:for _ inrange(total):# Do something
time.sleep(0.5)
bar()# Define threads
threads =[
threading.Thread(target=simulate_task, args=('Task A',50)),
threading.Thread(target=simulate_task, args=('Task B',70)),
threading.Thread(target=simulate_task, args=('Task C',40)),]# Start each threadfor t in threads:
t.start()# Block the main thread until the program is finishedfor t in threads:
t.join()Con la tecnología de
La biblioteca alive-progress incluye varios temas incorporados. Los temas controlan elementos como el estilo de animación, los caracteres utilizados para rellenar la barra y el efecto general del movimiento. Algunos temas comunes son classic, pulse y brackets.
import time
from alive_progress import alive_bar
with alive_bar(100, bar='blocks')as bar:for _ inrange(100):# Do something
time.sleep(0.02)
bar()Con la tecnología de
Pausa/reanudar - detener temporalmente y reanudar el progreso sin perder el estado
from alive_progress import alive_bar
import time
# Run a task...with alive_bar(100)as bar:for i inrange(50):# Do something
time.sleep(0.02)
bar()# Pause
bar.text('Temporarily pausing...')
time.sleep(1)# Resume
bar.text('Resuming...')for i inrange(50):
time.sleep(0.02)
bar()Con la tecnología de
Barras de progreso GUI con Tkinter
Tkinter es el conjunto de herramientas GUI (Interfaz Gráfica de Usuario) estándar de Python. El diseño incluye funciones integradas y está listo para usar, por lo que no necesitas instalar nada adicional. Puedes crear ventanas, botones, campos de texto, menús, barras de progreso y mucho más. Tkinter es ideal para crear aplicaciones de escritorio sencillas, herramientas interactivas y prototipos.
Se puede crear una barra de progreso básica utilizando el código siguiente.
import tkinter as tk
from tkinter import ttk
import time
defstart_progress():
progress["value"]=0
root.update_idletasks()for i inrange(101):
time.sleep(0.02)
progress["value"]= i
root.update_idletasks()# Set up the window
root = tk.Tk()
root.title("Progress Bar")
root.geometry("300x100")# Create a progress bar
progress = ttk.Progressbar(root, orient="horizontal", length=250, mode="determinate")
progress.pack(pady=20)# Create a start button
start_button = ttk.Button(root, text="Start", command=start_progress)
start_button.pack()# Start the tkinter loop
root.mainloop()Con la tecnología de
Salida en mi Mac:
Hay dos modos disponibles con ttk.Progressbar: determinado e indeterminado. El modo determinado se utiliza cuando se conoce la duración o el número de pasos de una tarea. El modo indeterminado se utiliza cuando la duración de la tarea es desconocida o no puede medirse en pasos.
El código anterior es para un modo determinado, ya que sabíamos que la longitud de la tarea era de 250 pasos. A continuación se presenta un ejemplo de modo indeterminado.
import tkinter as tk
from tkinter import ttk
import time
import threading
defstart_indeterminate():defrun():# 10 ms between moves
progress.start(10)# Simulate task of unknown duration
time.sleep(10)# Stop
progress.stop()# Run in a thread, else the tkinter GUI loop is unresponsive
threading.Thread(target=run).start()# Set up the GUI
root = tk.Tk()
root.title("Indeterminate Progress Bar")
root.geometry("300x100")# Create an indeterminate progress bar
progress = ttk.Progressbar(root, mode='indeterminate', length=250)
progress.pack(pady=20)# Start button
start_button = ttk.Button(root, text="Start", command=start_indeterminate)
start_button.pack()# Run the tkinter loop
root.mainloop()Con la tecnología de
Ten en cuenta que la barra de progreso se ejecutó en un hilo independiente. Si utilizáramos run() directamente en el hilo principal, la llamada a time.sleep() bloquearía el bucle de eventos principal de Tkinter y provocaría la congelación de toda la interfaz gráfica de usuario, incluidos los clics de los botones, el redibujado de las ventanas y la animación de la barra de progreso.
Consideraciones sobre el rendimiento y optimización
¿Qué biblioteca debes utilizar para tu barra de progreso? Parte de la decisión depende de tus requisitos de sobrecarga y de tu caso de uso.
Biblioteca
Sobrecarga
Caso práctico
tqdm
Muy bajo
Bucles rápidos, canalización de datos, impacto mínimo en el rendimiento
progreso
Baja
Scripts CLI sencillos, ligeros y sin dependencias
barra de progreso2
Moderado
Diseños personalizados, ETA y registro; ligera ralentización en tareas rápidas
vivo-progreso
Moderada a alta
Tareas visualmente ricas, salida multibarra, animaciones suaves; mejor para tareas largas
Para mejorar el rendimiento, optimiza la frecuencia de actualización. Un método consiste en no actualizar la barra en cada iteración. Esto es especialmente importante en los bucles rápidos o de alta frecuencia. Utiliza la lógica condicional para actualizar cada N pasos, por ejemplo, cada 100 iteraciones.
En ajustes críticos de rendimiento o código de producción, desactiva las barras de progreso. Aquí no se necesita información visual. Esto ahorra recursos al tiempo que garantiza que la lógica sigue siendo la misma para el desarrollo o la depuración.
Reducir las operaciones de E/S es clave para el rendimiento. Escribir en el terminal, en el disco o en la red puede ralentizar las cosas. He aquí algunas estrategias para reducir la E/S en tareas críticas para el rendimiento.
Almacena la salida y escribe por lotes en lugar de por iteración.
Actualiza sólo a intervalos fijos o en condiciones específicas.
Minimiza o desactiva print() dentro de los bucles.
Añade banderas para suprimir la salida innecesaria en producción.
Separa la E/S y el cálculo utilizando hilos o multiprocesamiento.
Comprime o agrupa por lotes las escrituras grandes para reducir la frecuencia de E/S del disco.
Buenas prácticas para barras de progreso eficaces
Veamos algunas de las mejores prácticas a tener en cuenta al crear barras de progreso en Python.
¿Por qué utilizar barras de progreso?
Hay muchas buenas razones para utilizar barras de progreso en tus aplicaciones. En primer lugar, proporcionan información en tiempo real, tranquilizando a los usuarios sobre el progreso de las tareas y reduciendo la incertidumbre. Esta visibilidad mejora la experiencia del usuario, haciendo que los tiempos de espera parezcan más cortos y las interacciones más intuitivas.
En segundo lugar, al realizar un seguimiento visual de la finalización de las tareas, las barras de progreso facilitan la supervisión del rendimiento, lo que permite tanto a los usuarios como a los programadores detectar rápidamente cuellos de botella o procesos estancados durante operaciones de larga duración. Por último, incorporar barras de progreso eleva la profesionalidad de la interfaz de tu aplicación, transmitiendo claridad y un enfoque de diseño reflexivo y centrado en el usuario.
Tareas de duración conocida frente a tareas de duración desconocida
Utiliza una barra de progreso determinada para las tareas que tengan un tiempo establecido. Esto incluye el procesamiento de archivos, bucles o épocas de entrenamiento de machine learning. Este tipo de barra se rellena en función del progreso medible y da a los usuarios una idea clara de cuánto trabajo queda por hacer.
Para las tareas de duración desconocida, como las llamadas a la API o las comprobaciones en segundo plano, utiliza un spinner o una barra indeterminada. Ofrecen una señal visual de que el proceso está en marcha, aunque no podamos predecir cuánto durará.
¿Qué biblioteca debo utilizar?
La biblioteca La biblioteca que utilices depende de las tareas que intentes realizar.
Tarea
Biblioteca
Notas
Bucles de alta frecuencia
tqdm
Ligero, eficiente; utiliza el minintervalo para reducir las actualizaciones
Guiones sencillos y puntuales
progreso
Configuración mínima, sin dependencias, ideal para tareas rápidas
Salida estructurada o personalizada
barra de progreso2
Basado en widgets, admite ETA, temporizadores y control de diseño
Tareas multietapa o anidadas
tqdm, vivo-progreso
Admite barras anidadas o visualizaciones multibarra para tareas en capas
Scripts CLI con pulido visual
vivo-progreso
Visuales animados y modernos, experiencia de usuario fluida
Aplicaciones GUI
tkinter
Conjunto de herramientas GUI incorporado con barras determinadas e indeterminadas
Personalización
Cuando personalices las barras de progreso, céntrate en la claridad y la información útil. Esfuérzate por conseguir un buen equilibrio entre ambos. Una barra clara y sencilla con métricas clave suele ser mejor que una abarrotada con demasiada información.
Puedes utilizar bibliotecas como progressbar2 y alive-progress. Te permiten cambiar el diseño, el color y la animación de tus barras de progreso. Utilizar temas o formatos para mejorar la experiencia del usuario. Evita saturar la pantalla con demasiados widgets o elementos visuales complejos. El objetivo es dar una respuesta útil. Queremos evitar distraer al usuario o que se sienta abrumado.
Tratamiento de excepciones y pruebas de compatibilidad
Envuelve la lógica de la barra de progreso en bloques try-except. Esto ayuda a evitar fallos en la interfaz de usuario o bloqueos si se produce un error durante una tarea. Esto es clave en los scripts que se ejecutan durante mucho tiempo o cuando se utilizan dependencias externas inciertas.
Además, prueba tus barras de progreso en distintos entornos. Compruébalo en varios sistemas operativos, tipos de terminal y anchos de pantalla. Así te asegurarás de que su comportamiento sigue siendo coherente.
Algunas bibliotecas se comportan de forma diferente en cuadernos Jupyter, terminales remotos o shells GUI. Verificar la compatibilidad con antelación puede ayudar a evitar problemas inesperados. De este modo, los usuarios tendrán una experiencia más fluida en la producción.
Consideraciones sobre accesibilidad
Cuando crees indicadores de progreso, ten en cuenta la accesibilidad. Esto ayuda a que todos los usuarios reciban una respuesta clara. Algunas sugerencias:
No confíes sólo en el color o la animación para mostrar el progreso. Añade elementos de texto como porcentajes, recuento de pasos o estimaciones de tiempo.
Utiliza elementos visuales claros y de alto contraste para mejorar la legibilidad.
Asegúrate de que tus barras de progreso funcionan bien con lectores de pantalla en aplicaciones GUI.
Para las herramientas de línea de comandos, considera las opciones de verbosidad que imprimen las actualizaciones de progreso en texto sin formato.
Hacer de la accesibilidad una prioridad aumenta la usabilidad. También hace que tus herramientas sean más inclusivas y profesionales.
Conclusión
Las barras de progreso son una función sencilla pero potente para cualquier aplicación Python. Proporcionan información instantánea, mejoran la experiencia del usuario y controlan el rendimiento y la claridad del código. Elegir la biblioteca de barras de progreso adecuada es clave. Puede mejorar tu software, tanto si estás creando un script rápido, una herramienta de línea de comandos o una aplicación GUI completa. Una implementación meditada puede mejorar la velocidad, profesionalidad y facilidad de uso de tu software. Dar prioridad a la personalización, el rendimiento, la compatibilidad y la accesibilidad hace que las barras de progreso sean algo más que meros elementos visuales. Se convierten en una parte importante del modo en que los usuarios se relacionan con tu trabajo.
Preguntas frecuentes sobre la barra de progreso en Python
¿Qué es una barra de progreso?⌄
Una barra de progreso es un indicador visual que muestra cuánto de una tarea se ha completado y cuánto queda. Mejora la experiencia del usuario proporcionándole información durante las operaciones largas.
¿Cuáles son las bibliotecas populares de barras de progreso en Python?⌄
Las bibliotecas más comunes son tqdm, progress, progressbar2, y alive-progress.
¿Puedo utilizar barras de progreso con la biblioteca pandas?⌄
Sí, puedes. tqdm se integra con pandas a través de progress_apply() (en lugar de apply) y métodos similares.
¿Puedo personalizar el aspecto de una barra de progreso?⌄
Sí. Bibliotecas como tqdm y progressbar2 te permiten personalizar el diseño, la anchura, el color y la frecuencia de actualización.
¿Qué biblioteca debo utilizar para Jupyter Notebooks?⌄
La biblioteca tqdm.notebook se integra bien con Jupyter.
Mark Pedigo, PhD, es un distinguido científico de datos con experiencia en ciencia de datos sanitarios, programación y educación. Doctor en Matemáticas, Licenciado en Informática y Certificado Profesional en Inteligencia Artificial, Mark combina los conocimientos técnicos con la resolución práctica de problemas. Su carrera incluye funciones en la detección del fraude, la predicción de la mortalidad infantil y la previsión financiera, junto con contribuciones al software de estimación de costes de la NASA. Como educador, ha impartido clases en DataCamp y en la Universidad Washington de San Luis, y ha sido mentor de programadores noveles. En su tiempo libre, Mark disfruta de la naturaleza de Minnesota con su esposa Mandy y su perro Harley, y toca el piano de jazz.
Este tutorial muestra cómo utilizar Matplotlib, una potente biblioteca de visualización de datos en Python, para crear gráficos de líneas, barras y dispersión con datos bursátiles.
Aprende a gestionar hilos y procesos con el módulo de multiprocesamiento de Python. Descubre las técnicas clave de la programación paralela. Mejora la eficacia de tu código con ejemplos.
Aprende sobre las clases abstractas de Python, su finalidad y cómo utilizar el módulo `abc` para aplicar interfaces coherentes. Incluye ejemplos prácticos y mejores prácticas para una implementación eficaz.
Desarrolla tus habilidades de programación en Python. Aprenderás a trabajar con módulos y paquetes, utilizar tipos de datos integrados y escribir funciones personalizadas.
En las aplicaciones actuales, los usuarios quieren una respuesta inmediata, especialmente cuando las tareas tardan mucho en completarse. Las barras de progreso de Python son una forma clara y sencilla de mostrar que algo está ocurriendo en segundo plano. Una barra de progreso sólida ayuda a que un programa parezca más rápido, añade un toque profesional y mejora la facilidad de uso.
En este artículo, aprenderás a implementar barras de progreso en Python utilizando bibliotecas populares como
tqdm,progress,progressbar2,alive-progress, yTkinter, junto con las mejores prácticas para mejorar la experiencia del usuario y el rendimiento de la aplicación.Para aprender más sobre los conceptos de Python de forma práctica, consulta nuestro curso Curso de Fundamentos de Programación en Python.
¿Qué son las barras de progreso en Python?
Las barras de progreso son omnipresentes. Suelen utilizarse para descargas de archivos, instalaciones de software y canalizaciones ETL. También son útiles para seguir el progreso del entrenamiento de modelos de machine learning.
La barra de progreso muestra cuánto de una tarea se ha completado y cuánto queda. Puede aparecer como texto en una interfaz de línea de comandos (CLI) o como una barra visual en una interfaz gráfica de usuario (GUI).
Las barras de progreso mejoran la experiencia del usuario. Proporcionan actualizaciones en tiempo real, mostrando a los usuarios su progreso en el proceso. Si se produce un retraso, los usuarios pueden decidir si intervienen o esperan. Esta visibilidad reduce la frustración y hace que los tiempos de espera parezcan más cortos. Los usuarios no se quedarán mirando una pantalla estática, preguntándose si está pasando algo; seguirán participando y se sentirán seguros de que se está avanzando.
Los programadores utilizan barras de progreso para controlar el rendimiento de la aplicación. Ayudan a identificar los cuellos de botella, comparar el código y hacer un seguimiento de la duración de las tareas. Las barras de progreso en guiones y flujos de trabajo muestran actualizaciones de estado claras. Ayudan a los usuarios a comprender mejor los procesos de larga duración. También mejoran la usabilidad de las herramientas interactivas y los cuadernos.
Las barras de progreso también pueden servir como una forma sencilla de supervisión del rendimiento. Muestran cuánto tiempo lleva cada tarea. Esto ayuda a los programadores a detectar las fases lentas y a medir la eficacia. Esto permite comparar fácilmente diferentes implementaciones.
Barras de progreso de la línea de comandos
Las barras de progreso de la línea de comandos proporcionan información visual sobre las tareas de larga duración directamente en el terminal, haciendo que los scripts sean más informativos y fáciles de usar. Python ofrece varias bibliotecas, cada una con puntos fuertes en velocidad, personalización y estilo visual. Examinaremos cuatro de ellos:
tqdm,progress,progressbar2, yalive-progress.Tqdm: la norma en rapidez y sencillez
tqdmes una popular biblioteca de Python para crear barras de progreso. Proporciona indicadores de progreso rápidos y versátiles para bucles e iterables. Realiza un seguimiento de las iteraciones y calcula tanto el tiempo restante como el tiempo transcurrido. Esta información actualiza la barra en tiempo real.tqdmfunciona en segundo plano. Predice cuánto tiempo queda y omite las actualizaciones que no son necesarias. Es fácil de aprender, consume poca memoria y está respaldado por una sólida comunidad.Proceso de instalación
Una forma fácil de instalar
tqdmes utilizar el instalador depip. Escribe el siguiente comando desde el terminal.Imprime el número de versión para asegurarte de que la biblioteca está instalada correctamente.
4.67.1Uso básico de tqdm
tqdmes fácil de usar. Importa la biblioteca. Envuelve cualquier iterable con tqdm(iterable) para mostrar una barra de progreso.En lugar de escribir
tqdm(range(n)), puedes utilizar la abreviaturatrange(n)por comodidad.Este código produce una barra de progreso en vivo durante la ejecución.
La barra de progreso muestra
Para añadir una descripción a la barra de progreso, especifica la opción
desc.Barras de progreso anidadas
Las barras de progreso anidadas en tqdm te ayudan a seguir el progreso en varios bucles. También son útiles cuando necesitas hacer un seguimiento de varias etapas de trabajo. Algunos ejemplos son el procesamiento por lotes, los bucles anidados y el entrenamiento de modelos.
Envuelve cada bucle en un bucle anidado con tqdm. Utiliza los argumentos posición y dejar para controlar cómo aparecen.
position: Establece la posición vertical de cada barra de progreso. posición=0 es la barra superior, posición=1 aparece debajo, y así sucesivamente.leave: Si leave=Verdadero, la barra de progreso permanece en pantalla después de que termine. Si leave=False, desaparece para evitar el desorden.Las barras de progreso anidadas muestran una jerarquía clara. Te ayudan a visualizar las distintas fases de una tarea. Proporcionan información detallada a varios niveles. Esto ayuda a los programadores a identificar ralentizaciones o cuellos de botella con facilidad.
Integración de Pandas
Tqdm se integra bien con pandas. Proporciona una forma sencilla de añadir barras de progreso a las tareas de DataFrame y series. Muestra el progreso en tiempo real de funciones como
apply,groupby, ymap. Estas funciones pueden ser lentas con grandes conjuntos de datos.Para activar esta función, llama a tqdm.pandas(). A continuación, utiliza
progress_applyen lugar del método habitual de pandasapply. Esto mostrará una barra de progreso a medida que tu función recorra filas o columnas. Verás el progreso de la operación sin reescribir tu código.En el siguiente programa, creamos un DataFrame con una columna llamada "números". Esta columna contiene números enteros de 0 a 1000. A continuación, generamos una nueva columna aplicando una operación "lenta" llamada
slow_squared.En lugar de utilizar la función estándar pandas apply, utilizamos
progress_applyde tqdm. Aparece una barra de progreso durante la operación. Proporciona actualizaciones en tiempo real sobre el grado de procesamiento completado.El resultado del código es el siguiente
Podemos utilizar
progress_applypara otras operaciones de DataFrame comogroupby.Opciones de personalización
Tqdm te permite personalizar las barras de progreso para adaptarlas a distintos entornos y necesidades de los usuarios. Puedes ajustar la anchura con
ncols. La páginabar_format argumentte ofrece un control total sobre la disposición del texto. Además, si configurasdynamic_ncols=True, la barra se redimensionará automáticamente para ajustarse al terminal.Consideraciones de rendimiento específicas de la tqdm
Tqdm es rápido y ligero. Añade poca sobrecarga, incluso en bucles rápidos. Puedes desactivar las barras de progreso con
disable=True. Esto es útil en entornos de producción donde el rendimiento es clave. Para bucles rápidos, actualizar la barra cada vez puede ser demasiado. Por eso,tqdmte permite controlar la frecuencia con la que se actualiza. Puedes utilizar parámetros comominintervalymaxinterval.Progreso: Estilos y giros personalizables
En Progreso de Python te permite crear fácilmente barras de progreso basadas en texto para la línea de comandos. Cuenta con una API sencilla. Admite barras de progreso y spinners y permite una personalización básica de la salida. Es pequeño, rápido y no tiene dependencias. Esto lo hace ideal para guiones rápidos y configuraciones sencillas.
La biblioteca
progressincluye siete estilos integrados de barras de progreso: Barra, Barra de carga, Barra de relleno de cuadrados, Barra de relleno de círculos, Barra incremental, Barra de píxeles y Barra de sombra.Para instalarlo, utiliza pip install.
Para utilizarlo, importa el estilo deseado, instala una variable, utiliza
.next()en el bucle y.finish()una vez finalizado el proceso. Por ejemplo, para utilizar una ChargingBar, utiliza el siguiente código.Progresstambién incluye giradores para tareas de duración desconocida. El código para implementar un spinner es sencillo.Este código da como resultado la descripción ("Procesando...") seguida de un spinner.
La biblioteca de progreso es sencilla y ligera, pero tiene algunas limitaciones que debes tener en cuenta. No es compatible con los cuadernos Jupyter, y no puede redimensionarse dinámicamente. Además, ofrece menos opciones de personalización que bibliotecas como tqdm. Funciona bien para tareas básicas de línea de comandos, pero puede tener problemas con trabajos complejos o de alto rendimiento.
Barra de progreso2: Personalización y compatibilidad mejoradas
Barra de progreso2 es una potente biblioteca de Python. Te ayuda a crear barras de progreso flexibles y personalizables para aplicaciones de línea de comandos. Tiene muchos widgets, como porcentaje, ETA, marcadores animados y contadores. Esto lo hace ideal para tareas CLI más complejas o pulidas.
Progressbar2 ofrece más opciones de control y formato que las bibliotecas más sencillas como progress. También funciona mejor con el registro y los flujos de trabajo multihilo.
Para instalarlo, utiliza pip install.
La clase ProgressBar de progressbar2 muestra el estado de progreso actual. Lo hace con un conjunto de widgets personalizables.
Un widget es una pieza modular que se actualiza en función del estado de la barra de progreso. Esto incluye el porcentaje completado, el tiempo transcurrido y el tiempo estimado restante.
Puedes elegir entre muchos tipos de widgets. Incluyen etiquetas de texto, marcadores de progreso, contadores, temporizadores, rotadores y formateadores personalizados. Esta variedad te permite personalizar el aspecto y la función de la barra para tu aplicación.
El uso básico de Progressbar2 es bastante sencillo.
La salida muestra el porcentaje completado, las iteraciones completadas/iteraciones totales, el tiempo transcurrido y el tiempo restante estimado.
Las bibliotecas de barras de progreso suelen basarse en la actualización de una sola línea en el terminal mediante retornos de carro (
\r). Esto significa que las declaraciones normales deprint()pueden interferir empujando la barra hacia abajo o corrompiendo su salida. La bibliotecaprogressbar2proporciona una forma segura de imprimir mensajes sin interferir con la barra de progreso.La biblioteca progressbar2 ofrece una amplia personalización a través de su sistema modular de widgets. Los widgets muestran detalles en la barra de progreso, como el porcentaje completado, el tiempo transcurrido, el tiempo restante estimado, contadores o animaciones de la barra. Puedes mezclar y combinar estos widgets para crear una barra de progreso personalizada. Por ejemplo, puedes mostrar el porcentaje y el tiempo estimado de llegada. También puedes añadir más detalles, como nombres de archivo, marcas de tiempo o giros.
Alive-progress: animaciones dinámicas para terminales modernos
Alive-progress muestra barras de progreso animadas que cambian en tiempo real. Esto da a las aplicaciones de línea de comandos un aspecto moderno y sensible. La barra avanza y muestra útiles métricas en tiempo real. Muestra el porcentaje completado, el tiempo transcurrido, el tiempo estimado restante y la velocidad de iteración. Esto la hace atractiva e informativa.
Para instalar el sitio alive-progress pip install.
Como se muestra en su página de GitHub, para ver una demostración de sus capacidades, utiliza el siguiente código.
Verás un resultado similar al siguiente.
Alive-progress tiene la capacidad de mostrar y gestionar varias barras de progreso simultáneamente.
La biblioteca
alive-progressincluye varios temas incorporados. Los temas controlan elementos como el estilo de animación, los caracteres utilizados para rellenar la barra y el efecto general del movimiento. Algunos temas comunes sonclassic,pulseybrackets.Pausa/reanudar - detener temporalmente y reanudar el progreso sin perder el estado
Barras de progreso GUI con Tkinter
Tkinter es el conjunto de herramientas GUI (Interfaz Gráfica de Usuario) estándar de Python. El diseño incluye funciones integradas y está listo para usar, por lo que no necesitas instalar nada adicional. Puedes crear ventanas, botones, campos de texto, menús, barras de progreso y mucho más. Tkinter es ideal para crear aplicaciones de escritorio sencillas, herramientas interactivas y prototipos.
Se puede crear una barra de progreso básica utilizando el código siguiente.
Salida en mi Mac:
Hay dos modos disponibles con ttk.Progressbar: determinado e indeterminado. El modo determinado se utiliza cuando se conoce la duración o el número de pasos de una tarea. El modo indeterminado se utiliza cuando la duración de la tarea es desconocida o no puede medirse en pasos.
El código anterior es para un modo determinado, ya que sabíamos que la longitud de la tarea era de 250 pasos. A continuación se presenta un ejemplo de modo indeterminado.
Ten en cuenta que la barra de progreso se ejecutó en un hilo independiente. Si utilizáramos
run()directamente en el hilo principal, la llamada atime.sleep()bloquearía el bucle de eventos principal de Tkinter y provocaría la congelación de toda la interfaz gráfica de usuario, incluidos los clics de los botones, el redibujado de las ventanas y la animación de la barra de progreso.Consideraciones sobre el rendimiento y optimización
¿Qué biblioteca debes utilizar para tu barra de progreso? Parte de la decisión depende de tus requisitos de sobrecarga y de tu caso de uso.
Biblioteca
Sobrecarga
Caso práctico
tqdm
Muy bajo
Bucles rápidos, canalización de datos, impacto mínimo en el rendimiento
progreso
Baja
Scripts CLI sencillos, ligeros y sin dependencias
barra de progreso2
Moderado
Diseños personalizados, ETA y registro; ligera ralentización en tareas rápidas
vivo-progreso
Moderada a alta
Tareas visualmente ricas, salida multibarra, animaciones suaves; mejor para tareas largas
Para mejorar el rendimiento, optimiza la frecuencia de actualización. Un método consiste en no actualizar la barra en cada iteración. Esto es especialmente importante en los bucles rápidos o de alta frecuencia. Utiliza la lógica condicional para actualizar cada N pasos, por ejemplo, cada 100 iteraciones.
En ajustes críticos de rendimiento o código de producción, desactiva las barras de progreso. Aquí no se necesita información visual. Esto ahorra recursos al tiempo que garantiza que la lógica sigue siendo la misma para el desarrollo o la depuración.
Reducir las operaciones de E/S es clave para el rendimiento. Escribir en el terminal, en el disco o en la red puede ralentizar las cosas. He aquí algunas estrategias para reducir la E/S en tareas críticas para el rendimiento.
Buenas prácticas para barras de progreso eficaces
Veamos algunas de las mejores prácticas a tener en cuenta al crear barras de progreso en Python.
¿Por qué utilizar barras de progreso?
Hay muchas buenas razones para utilizar barras de progreso en tus aplicaciones. En primer lugar, proporcionan información en tiempo real, tranquilizando a los usuarios sobre el progreso de las tareas y reduciendo la incertidumbre. Esta visibilidad mejora la experiencia del usuario, haciendo que los tiempos de espera parezcan más cortos y las interacciones más intuitivas.
En segundo lugar, al realizar un seguimiento visual de la finalización de las tareas, las barras de progreso facilitan la supervisión del rendimiento, lo que permite tanto a los usuarios como a los programadores detectar rápidamente cuellos de botella o procesos estancados durante operaciones de larga duración. Por último, incorporar barras de progreso eleva la profesionalidad de la interfaz de tu aplicación, transmitiendo claridad y un enfoque de diseño reflexivo y centrado en el usuario.
Tareas de duración conocida frente a tareas de duración desconocida
Utiliza una barra de progreso determinada para las tareas que tengan un tiempo establecido. Esto incluye el procesamiento de archivos, bucles o épocas de entrenamiento de machine learning. Este tipo de barra se rellena en función del progreso medible y da a los usuarios una idea clara de cuánto trabajo queda por hacer.
Para las tareas de duración desconocida, como las llamadas a la API o las comprobaciones en segundo plano, utiliza un spinner o una barra indeterminada. Ofrecen una señal visual de que el proceso está en marcha, aunque no podamos predecir cuánto durará.
¿Qué biblioteca debo utilizar?
La biblioteca La biblioteca que utilices depende de las tareas que intentes realizar.
Tarea
Biblioteca
Notas
Bucles de alta frecuencia
tqdm
Ligero, eficiente; utiliza el minintervalo para reducir las actualizaciones
Guiones sencillos y puntuales
progreso
Configuración mínima, sin dependencias, ideal para tareas rápidas
Salida estructurada o personalizada
barra de progreso2
Basado en widgets, admite ETA, temporizadores y control de diseño
Tareas multietapa o anidadas
tqdm, vivo-progreso
Admite barras anidadas o visualizaciones multibarra para tareas en capas
Scripts CLI con pulido visual
vivo-progreso
Visuales animados y modernos, experiencia de usuario fluida
Aplicaciones GUI
tkinter
Conjunto de herramientas GUI incorporado con barras determinadas e indeterminadas
Personalización
Cuando personalices las barras de progreso, céntrate en la claridad y la información útil. Esfuérzate por conseguir un buen equilibrio entre ambos. Una barra clara y sencilla con métricas clave suele ser mejor que una abarrotada con demasiada información.
Puedes utilizar bibliotecas como progressbar2 y alive-progress. Te permiten cambiar el diseño, el color y la animación de tus barras de progreso. Utilizar temas o formatos para mejorar la experiencia del usuario. Evita saturar la pantalla con demasiados widgets o elementos visuales complejos. El objetivo es dar una respuesta útil. Queremos evitar distraer al usuario o que se sienta abrumado.
Tratamiento de excepciones y pruebas de compatibilidad
Envuelve la lógica de la barra de progreso en bloques try-except. Esto ayuda a evitar fallos en la interfaz de usuario o bloqueos si se produce un error durante una tarea. Esto es clave en los scripts que se ejecutan durante mucho tiempo o cuando se utilizan dependencias externas inciertas.
Además, prueba tus barras de progreso en distintos entornos. Compruébalo en varios sistemas operativos, tipos de terminal y anchos de pantalla. Así te asegurarás de que su comportamiento sigue siendo coherente.
Algunas bibliotecas se comportan de forma diferente en cuadernos Jupyter, terminales remotos o shells GUI. Verificar la compatibilidad con antelación puede ayudar a evitar problemas inesperados. De este modo, los usuarios tendrán una experiencia más fluida en la producción.
Consideraciones sobre accesibilidad
Cuando crees indicadores de progreso, ten en cuenta la accesibilidad. Esto ayuda a que todos los usuarios reciban una respuesta clara. Algunas sugerencias:
Hacer de la accesibilidad una prioridad aumenta la usabilidad. También hace que tus herramientas sean más inclusivas y profesionales.
Conclusión
Las barras de progreso son una función sencilla pero potente para cualquier aplicación Python. Proporcionan información instantánea, mejoran la experiencia del usuario y controlan el rendimiento y la claridad del código. Elegir la biblioteca de barras de progreso adecuada es clave. Puede mejorar tu software, tanto si estás creando un script rápido, una herramienta de línea de comandos o una aplicación GUI completa. Una implementación meditada puede mejorar la velocidad, profesionalidad y facilidad de uso de tu software. Dar prioridad a la personalización, el rendimiento, la compatibilidad y la accesibilidad hace que las barras de progreso sean algo más que meros elementos visuales. Se convierten en una parte importante del modo en que los usuarios se relacionan con tu trabajo.
Para seguir aprendiendo, consulta estos recursos: