>백엔드 개발 >파이썬 튜토리얼 >성능 향상을 위해 Matplotlib 플로팅 속도를 높이는 방법은 무엇입니까?

성능 향상을 위해 Matplotlib 플로팅 속도를 높이는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-19 20:48:291086검색

How to Speed Up Matplotlib Plotting to Enhance Performance?

Matplotlib이 왜 이렇게 느린가요?

Python 플로팅 라이브러리를 평가할 때 성능을 고려하는 것이 중요합니다. 널리 사용되는 라이브러리인 Matplotlib는 속도가 느린 것처럼 보일 수 있으며 속도를 높이거나 대체 옵션을 모색하는 것에 대한 의문을 제기할 수 있습니다. 문제를 자세히 살펴보고 가능한 해결 방법을 살펴보겠습니다.

제공된 예는 여러 하위 플롯과 데이터 업데이트가 포함된 플롯을 보여줍니다. Matplotlib를 사용하면 이 프로세스에 축 경계 및 눈금 레이블을 포함한 모든 것을 다시 그리는 작업이 포함되어 성능이 저하됩니다.

병목 현상 이해

두 가지 핵심 요소가 속도 저하에 기여합니다.

  1. 과도한 다시 그리기: Matplotlib의 fig.canvas.draw() 함수는 작은 부분만 업데이트해야 하는 경우에도 전체 그림을 다시 그립니다.
  2. 풍부한 눈금 레이블: 눈금 레이블과 서브플롯이 많으면 그리기 프로세스에 상당한 부담을 줄 수 있습니다.

블리팅으로 최적화

이러한 병목 현상을 해결하려면 , 블리팅 사용을 고려해보세요. 블리팅에는 그림의 특정 부분만 업데이트하여 렌더링 시간을 줄이는 작업이 포함됩니다. 그러나 효율적인 구현을 위해서는 백엔드별 코드가 필요하며 이를 위해서는 GUI 툴킷 내에 Matplotlib 플롯을 포함해야 할 수 있습니다.

GUI 중립 블리팅

GUI 중립 블리팅 기술은 백엔드 종속성 없이 합리적인 성능을 제공할 수 있습니다.

  1. 배경 캡처: 애니메이션 전에 각 하위 플롯의 배경을 캡처하여 나중에 복원합니다.
  2. 업데이트 및 그리기: 각 프레임에 대해 선의 데이터와 아티스트를 업데이트하고 배경을 복원하고 업데이트된 부분을 블리트합니다.
  3. 다시 그리기 방지: fig.canvas.blit( ax.bbox) 대신 fig.canvas.draw()를 사용하여 필요한 영역만 업데이트합니다.

구현 예:

<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 버전에는 블리팅을 단순화하는 애니메이션 모듈이 포함되어 있습니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.