为什么 Matplotlib 这么慢?
在评估 Python 绘图库时,考虑性能很重要。 Matplotlib 是一个广泛使用的库,它看起来可能很缓慢,引发了关于加快速度或探索替代选项的问题。让我们深入研究这个问题并探索可能的解决方案。
提供的示例展示了具有多个子图和数据更新的图。使用 Matplotlib,此过程涉及重绘所有内容,包括轴边界和刻度标签,从而导致性能降低。
了解瓶颈
导致速度缓慢的两个关键因素:
使用 Blitting 进行优化
解决这些瓶颈,考虑使用位块传送。 Blitting 涉及仅更新图形的特定部分,从而减少渲染时间。然而,为了高效实现,需要特定于后端的代码,这可能需要在 GUI 工具包中嵌入 Matplotlib 绘图。
GUI-中性位图传送
A GUI-中性位图传送技术可以在不依赖后端的情况下提供合理的性能:
示例实现:
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)
动画模块
最新的 Matplotlib 版本包含一个动画模块,它简化了 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)
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3