matplotlib savefig performance, guardar múltiples pngs dentro del bucle

Espero encontrar una manera de optimizar la siguiente situación. Tengo un gran diagrama de contorno creado con imshow de matplotlib. Luego quiero usar este diagrama de contorno para crear una gran cantidad de imágenes png, donde cada imagen es una pequeña sección de la imagen de contorno cambiando los límites xey, y la relación de aspecto.

Por lo tanto, no hay datos de trazado que cambien en el bucle, solo los límites del eje y la relación de aspecto cambian entre cada imagen png.

El siguiente MWE crea 70 imágenes png en una carpeta "higos" que demuestran la idea simplificada. Alrededor del 80% del tiempo de ejecución es ocupado porfig.savefig('figs/'+filename).

He investigado lo siguiente sin llegar a una mejora:

Una alternativa amatplotlib con un enfoque en la velocidad: me costó encontrar ejemplos / documentación de contornos / gráficos de superficie con requisitos similaresMultiprocesamiento: preguntas similares que he visto aquí parecen requerirfig = plt.figure() yax.imshow para ser llamado dentro del bucle, ya que higo y hacha no se pueden encurtir. En mi caso, esto será más costoso que cualquier ganancia de velocidad lograda al implementar multiprocesamiento.

Agradecería cualquier idea o sugerencia que pueda tener.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta