为什么 Matplotlib 这么慢?
在评估 Python 绘图库时,考虑性能很重要。 Matplotlib 是一个广泛使用的库,它看起来可能很缓慢,引发了关于加快速度或探索替代选项的问题。让我们深入研究这个问题并探索可能的解决方案。
提供的示例展示了具有多个子图和数据更新的图。使用 Matplotlib,此过程涉及重绘所有内容,包括轴边界和刻度标签,从而导致性能下降。
了解瓶颈
导致缓慢的两个关键因素:
使用 Blitting 进行优化
解决这些瓶颈,考虑使用位块传送。 Blitting 涉及仅更新图形的特定部分,从而减少渲染时间。然而,为了高效实现,需要特定于后端的代码,这可能需要在 GUI 工具包中嵌入 Matplotlib 绘图。
GUI 中性位图传输
GUI 中性位图传输该技术可以在不依赖后端的情况下提供合理的性能:
示例实现:
<code class="python">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)</code>
动画模块
最近的 Matplotlib 版本包含一个动画模块,它简化了 blitting:
<code class="python">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)</code>
以上是如何加速 Matplotlib 绘图以提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!