"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Al trazar con Matplotlib, ¿por qué se ve afectado el rendimiento y qué se puede hacer?

Al trazar con Matplotlib, ¿por qué se ve afectado el rendimiento y qué se puede hacer?

Publicado el 2024-11-06
Navegar:470

When Plotting with Matplotlib, Why Does Performance Suffer and What Can Be Done?

Consideraciones de rendimiento para el trazado de Matplotlib

Al evaluar diferentes bibliotecas de trazado de Python, es posible que encuentre problemas de rendimiento al utilizar Matplotlib. Este artículo explora por qué el trazado de Matplotlib puede ser lento y proporciona soluciones para mejorar su velocidad.

Causas de lentitud

El lento rendimiento de Matplotlib se debe principalmente a dos factores:

  • Redibujados frecuentes: Cada vez que se llama a fig.canvas.draw(), Actualiza toda la figura, incluidos elementos como límites de ejes y etiquetas de marcas. Este proceso requiere un uso computacional intensivo.
  • Numerosas subtramas: Las tramas con múltiples subtramas que presentan muchas etiquetas de marca pueden ralentizar significativamente el procesamiento.

Mejora del rendimiento

Para mejorar el rendimiento, considere las siguientes estrategias:

1. Utilice Blitting:

Blitting implica solo actualizar una porción específica del lienzo en lugar de volver a dibujar la figura completa. Esto reduce drásticamente la sobrecarga computacional. Matplotlib proporciona métodos de blitting específicos de backend que varían según el marco de GUI utilizado.

2. Restringir el redibujado:

Utilice la opción animada=True al trazar. Combinada con el módulo de animaciones de Matplotlib, esta técnica permite actualizaciones de objetos específicos sin activar un rediseño completo del lienzo.

3. Personalizar subtramas:

Minimiza el número de subtramas y etiquetas de marca. Elimine elementos innecesarios para reducir el tiempo de renderizado.

4. Mejore la eficiencia del código:

Refactorice su código para mejorar su estructura y reducir la cantidad de operaciones realizadas. Utilice operaciones vectorizadas siempre que sea posible.

Ejemplo:

Aquí hay una versión optimizada del código proporcionado en la pregunta, usando blitting con copy_from_bbox y recovery_region:

import matplotlib.pyplot as plt
import numpy as np
import time

x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)

fig, axes = plt.subplots(nrows=6)
fig.show()  # Draw the canvas initially

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'p-']
lines = [ax.plot(x, y, style)[0] for ax, style in zip(axes, styles)]

# Store background images of the axes
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

tstart = time.time()               
for i in range(1, 200):
    for j, line in enumerate(lines, start=1):
        # Restore the background
        fig.canvas.restore_region(backgrounds[j-1])
        
        # Update the data
        line.set_ydata(sin(j*x i/10.0))  

        # Draw the artist and blit
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

print('FPS:', 200/(time.time()-tstart))

Bibliotecas alternativas

Si el rendimiento de Matplotlib sigue siendo insatisfactorio, considere bibliotecas de trazado alternativas como como Bokeh, Plotly o Altair. Estas bibliotecas priorizan la interactividad en tiempo real y la optimización del rendimiento.

Declaración de liberación Este artículo se reimprime en: 1729341981 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3