2010-06-04 11 views
5

Ho un ciclo che esegue il corpo circa 200 volte. In ogni iterazione del ciclo, esegue un calcolo sofisticato, quindi, come debug, desidero produrre una heatmap di una matrice NxM. Ma generare questa heatmap è insopportabilmente lento e rallenta notevolmente un algoritmo già lento.pyplot: creazione di mappe di calore molto lenta

mio codice è lungo le linee:

import numpy 
import matplotlib.pyplot as plt 
for i in range(200): 
    matrix = complex_calculation() 
    plt.set_cmap("gray") 
    plt.imshow(matrix) 
    plt.savefig("frame{0}.png".format(i)) 

La matrice, da NumPy, non è enorme --- 300 x 600 di doppie. Anche se non salvi la figura e invece aggiorno una trama sullo schermo, è ancora più lenta.

Sicuramente devo abusare di pyplot. (Matlab può farlo, nessun problema.) Come faccio a velocizzare questo?

risposta

5

Prova a mettere plt.clf() nel ciclo per cancellare la cifra attuale:

for i in range(200): 
    matrix = complex_calculation() 
    plt.set_cmap("gray") 
    plt.imshow(matrix) 
    plt.savefig("frame{0}.png".format(i)) 
    plt.clf() 

Se non si esegue questa operazione, il ciclo rallenta come la macchina si sforza di allocare più e più memoria per la figura.

+0

Ancora lento, ma almeno ora è sopportabile. – carl

3

Penso che questo sia un po 'più veloce:

import matplotlib.pyplot as plt 
from matplotlib import cm 
fig = plt.figure() 
ax = fig.add_axes([0.1,0.1,0.8,0.8]) 
for i in range(200): 
    matrix = complex_calculation() 
    ax.imshow(matrix, cmap=cm.gray) 
    fig.savefig("frame{0}.png".format(i)) 

plt.imshow chiamate gca che chiama gcf che controlla per vedere se c'è una figura; se no, ne crea uno. Istanziando manualmente prima la figura, non è necessario fare tutto ciò.

Problemi correlati