為什麼 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