2010-06-04 14 views
5

Ich habe eine Schleife, die den Körper etwa 200 mal ausführt. In jeder Schleifeniteration führt es eine hochentwickelte Berechnung durch, und dann möchte ich als Debugging eine Heatmap einer NxM-Matrix erzeugen. Aber das Erzeugen dieser Heatmap ist unerträglich langsam und verlangsamt einen bereits langsamen Algorithmus erheblich.pyplot: wirklich langsam Heatmaps erstellen

Mein Code ist entlang der Linien:

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

Die Matrix, aus numpy, ist nicht riesig --- 300 x 600 Doppelzimmer. Auch wenn ich die Figur nicht speichere und stattdessen eine Bildschirmdarstellung aktualisiere, ist sie noch langsamer.

Sicher muss ich pyplot missbrauchen. (Matlab kann das, kein Problem.) Wie beschleunige ich das?

Antwort

5

Try plt.clf() in der Schleife setzt die aktuelle Zahl zu löschen:

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

Wenn Sie dies nicht tun, die Schleife verlangsamt, da die Maschine mehr und mehr Speicher für die Figur zuzuordnen kämpft.

+0

Noch langsam, aber zumindest ist es jetzt erträglich. – carl

3

Ich denke, das ist ein bisschen schneller ist:

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 Anrufe gca die gcf Anrufe, die überprüft, ob es eine Figur ist; Wenn nicht, erzeugt es eins. Wenn Sie die Figur zuerst manuell instanziieren, müssen Sie nicht alles tun.

Verwandte Themen