Ich hoffe, einen Weg zu finden, um die folgende Situation zu optimieren. Ich habe ein großes Konturplot mit imshow von Matplotlib erstellt. Ich möchte dann dieses Konturdiagramm verwenden, um eine große Anzahl von PNG-Bildern zu erstellen, wobei jedes Bild ein kleiner Abschnitt des Konturenbildes ist, indem die X- und Y-Grenzen und das Seitenverhältnis geändert werden.matplotlib savefig leistung, spart mehrere png in loop
In der Schleife ändern sich also keine Plotdaten, nur die Achsengrenzen und das Seitenverhältnis ändern sich zwischen den einzelnen Png-Bildern.
Das folgende MWE erstellt 70 Png Bilder in einem Ordner "Feigen", die die vereinfachte Idee zeigen. Etwa 80% der Laufzeit werden von fig.savefig('figs/'+filename)
eingenommen.
Ich habe ohne zu kommen mit einer Verbesserung in den folgenden sah:
- Eine Alternative zu
matplotlib
mit einem Fokus auf Geschwindigkeit - ich habe gekämpft keine Beispiele/Dokumentation der Kontur/Oberfläche Plots finden mit ähnlichen Anforderungen - Multiprocessing - Ähnliche Fragen, die ich hier gesehen habe, scheinen
fig = plt.figure()
undax.imshow
innerhalb der Schleife aufgerufen werden, da Feige und Axt nicht gebeizt werden kann. In meinem Fall ist dies teurer als Geschwindigkeitsverbesserungen, die durch die Implementierung von Multiprocessing erreicht werden.
Ich würde alle Einsichten oder Vorschläge, die Sie haben könnten, schätzen.
import numpy as np
import matplotlib as mpl
mpl.use('agg')
import matplotlib.pyplot as plt
import time, os
def make_plot(x, y, fix, ax):
aspect = np.random.random(1)+y/2.0-x
xrand = np.random.random(2)*x
xlim = [min(xrand), max(xrand)]
yrand = np.random.random(2)*y
ylim = [min(yrand), max(yrand)]
filename = '{:d}_{:d}.png'.format(x,y)
ax.set_aspect(abs(aspect[0]))
ax.set_xlim(xlim)
ax.set_ylim(ylim)
fig.savefig('figs/'+filename)
if not os.path.isdir('figs'):
os.makedirs('figs')
data = np.random.rand(25, 25)
fig = plt.figure()
ax = fig.add_axes([0., 0., 1., 1.])
# in the real case, imshow is an expensive calculation which can't be put inside the loop
ax.imshow(data, interpolation='nearest')
tstart = time.clock()
for i in range(1, 8):
for j in range(3, 13):
make_plot(i, j, fig, ax)
print('took {:.2f} seconds'.format(time.clock()-tstart))