"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 > ¿Cómo acelerar el trazado de Matplotlib para mejorar el rendimiento?

¿Cómo acelerar el trazado de Matplotlib para mejorar el rendimiento?

Publicado el 2024-11-06
Navegar:519

How to Speed Up Matplotlib Plotting to Enhance Performance?

¿Por qué Matplotlib es tan lento?

Al evaluar las bibliotecas de trazado de Python, es importante considerar el rendimiento. Matplotlib, una biblioteca ampliamente utilizada, puede parecer lenta, lo que genera dudas sobre cómo acelerarla o explorar opciones alternativas. Profundicemos en el problema y exploremos posibles soluciones.

El ejemplo proporcionado muestra una trama con múltiples subtramas y actualizaciones de datos. Con Matplotlib, este proceso implica volver a dibujar todo, incluidos los límites de los ejes y las etiquetas de marca, lo que genera un rendimiento lento.

Comprender los cuellos de botella

Dos factores clave contribuyen a la lentitud:

  1. Redibujado excesivo: La función fig.canvas.draw() de Matplotlib vuelve a dibujar la figura completa, incluso cuando solo es necesario actualizar una pequeña parte.
  2. Abundantes etiquetas de ticks: Una gran cantidad de etiquetas de ticks y subtramas pueden sobrecargar significativamente el proceso de dibujo.

Optimizar con Blitting

Para abordar estos cuellos de botella , considere usar blitting. Blitting implica actualizar solo partes específicas de la figura, lo que reduce el tiempo de renderizado. Sin embargo, se necesita código específico de backend para una implementación eficiente, lo que puede requerir la incorporación de gráficos de Matplotlib dentro de un conjunto de herramientas GUI.

Blitting GUI-Neutral

Un blitting GUI-neutral La técnica puede proporcionar un rendimiento razonable sin dependencia del backend:

  1. Capturar fondo: Antes de la animación, capture el fondo de cada subtrama para restaurarla más tarde.
  2. Actualizar y Dibujar: Para cada fotograma, actualiza los datos y el artista de las líneas, restaurando el fondo y borrando la parte actualizada.
  3. Evita volver a dibujar: Usa fig.canvas.blit( ax.bbox) en lugar de fig.canvas.draw() para actualizar solo el área necesaria.

Ejemplo de implementación:

import matplotlib.pyplot as plt
import numpy as np

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

fig, axes = plt.subplots(nrows=6)

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
    return ax.plot(x, y, style, animated=True)[0]

lines = [plot(ax, style) for ax, style in zip(axes, styles)]

# Capture Background
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

for i in xrange(1, 2000):
    for j, (line, ax, background) in enumerate(zip(lines, axes, backgrounds), start=1):
        fig.canvas.restore_region(background)
        line.set_ydata(np.sin(j*x   i/10.0))
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

Módulo de animación

Las versiones recientes de Matplotlib incluyen un módulo de animaciones, que simplifica el blitting:

import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(i):
    for j, line in enumerate(lines, start=1):
        line.set_ydata(np.sin(j*x   i/10.0))

ani = animation.FuncAnimation(fig, animate, xrange(1, 200), interval=0, blit=True)
Declaración de liberación Este artículo se reimprime en: 1729342040 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