¿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:
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:
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)
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