"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Ao plotar com Matplotlib, por que o desempenho é prejudicado e o que pode ser feito?

Ao plotar com Matplotlib, por que o desempenho é prejudicado e o que pode ser feito?

Publicado em 2024-11-06
Navegar:929

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

Considerações de desempenho para plotagem Matplotlib

Ao avaliar diferentes bibliotecas de plotagem Python, você pode encontrar problemas de desempenho ao usar Matplotlib. Este artigo explora por que a plotagem do Matplotlib pode ser lenta e fornece soluções para melhorar sua velocidade.

Causas de lentidão

O desempenho lento do Matplotlib decorre principalmente de dois fatores:

  • Redesenhamentos frequentes: Cada vez que fig.canvas.draw() é chamado, ele atualiza a figura inteira, incluindo elementos como limites de eixos e rótulos de escala. Esse processo exige muita computação.
  • Numerosas subparcelas: Gráficos com várias subparcelas com muitos rótulos de escala podem retardar significativamente a renderização.

Melhorando o desempenho

Para melhorar o desempenho, considere as seguintes estratégias:

1. Use Blitting:

Blitting envolve apenas atualizar uma parte específica da tela em vez de redesenhar a figura inteira. Isso reduz drasticamente a sobrecarga computacional. Matplotlib fornece métodos blitting específicos de backend que variam dependendo da estrutura GUI usada.

2. Restringir redesenho:

Utilize a opçãoanimated=True ao plotar. Combinada com o módulo de animações Matplotlib, esta técnica permite atualizações de objetos específicos sem acionar um redesenho completo da tela.

3. Personalizar subtramas:

Minimize o número de subparcelas e marque rótulos. Remova elementos desnecessários para reduzir o tempo de renderização.

4. Aumente a eficiência do código:

Refatore seu código para melhorar sua estrutura e reduzir o número de operações realizadas. Utilize operações vetorizadas sempre que possível.

Exemplo:

Aqui está uma versão otimizada do código fornecido na pergunta, usando blitting com copy_from_bbox e restore_region:

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))

Bibliotecas alternativas

Se o desempenho do Matplotlib permanecer insatisfatório, considere bibliotecas de plotagem alternativas, como como Bokeh, Plotly ou Altair. Essas bibliotecas priorizam a interatividade em tempo real e a otimização do desempenho.

Declaração de lançamento Este artigo foi reimpresso em: 1729341981 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3