使用 Matplotlib 繪圖時,為什麼效能會受到影響以及可以採取什麼措施?

Susan Sarandon
發布: 2024-10-19 20:47:30
原創
122 人瀏覽過

When Plotting with Matplotlib, Why Does Performance Suffer and What Can Be Done?

Matplotlib 圖庫的效能注意事項

在評估不同的 Python 繪圖函式庫時,使用 Matplotlib 時可能會遇到效能問題。本文探討了 Matplotlib 繪圖速度緩慢的原因,並提供了提高其速度的解決方案。

緩慢的原因

Matplotlib 表現緩慢主要源自於兩個因素:

  • 頻繁重繪:每次呼叫Fig.canvas.draw() 時,它都會刷新整個圖形,包括軸邊界和刻度標籤等元素。此過程的計算量很大。
  • 大量子圖:具有多個刻度標籤的多個子圖的圖會顯著減慢渲染速度。

提高性能

要提高效能,請考慮以下策略:

1.使用Blitting:

1.使用Blitting:

Blitting 僅涉及更新畫布的特定部分,而不是重新繪製整個圖形。這大大減少了計算開銷。 Matplotlib 提供了後端特定的 blitting 方法,這些方法根據所使用的 GUI 框架而有所不同。

2.限制重繪:

繪圖時使用animated=True 選項。與 Matplotlib 動畫模組結合,該技術允許特定物件更新,而不會觸發整個畫布重繪。

3.自訂子圖:

最小化子圖和刻度標籤的數量。刪除不必要的元素以減少渲染時間。

4.提高程式碼效率:

重構程式碼以改善其結構並減少執行的操作數量。盡可能利用向量化操作。

範例:

<code class="python">import matplotlib.pyplot as plt
import numpy as np
import time

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

fig, axes = plt.subplots(nrows=6)
fig.show()  # Draw the canvas initially

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'p-']
lines = [ax.plot(x, y, style)[0] for ax, style in zip(axes, styles)]

# Store background images of the axes
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

tstart = time.time()               
for i in range(1, 200):
    for j, line in enumerate(lines, start=1):
        # Restore the background
        fig.canvas.restore_region(backgrounds[j-1])
        
        # Update the data
        line.set_ydata(sin(j*x+i/10.0))  

        # Draw the artist and blit
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

print('FPS:', 200/(time.time()-tstart))</code>
登入後複製

這是問題中提供的程式碼的最佳化版本,使用copy_from_bbox 和Restore_region 進行位圖傳輸:

替代庫如果Matplotlib 的性能仍然不能令人滿意,請考慮替代繪圖庫,例如BokehPlotly

或牽引>牛星。這些庫優先考慮即時互動性和效能優化。

以上是使用 Matplotlib 繪圖時,為什麼效能會受到影響以及可以採取什麼措施?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!