Matplotlib savefig производительность, сохранение нескольких PNG в цикле

Я надеюсь найти способ оптимизировать следующую ситуацию. У меня большой контурный сюжет, созданный с помощью imshow из matplotlib. Затем я хочу использовать этот контурный график для создания большого количества изображений в формате png, где каждое изображение представляет собой небольшой участок контурного изображения путем изменения пределов x и y и соотношения сторон.

Таким образом, никакие данные графика не изменяются в цикле, только пределы оси и пропорции изменяются между каждым изображением PNG.

Следующий MWE создает 70 png изображений в папке «figs», демонстрируя упрощенную идею. Около 80% времени выполнения занятоfig.savefig('figs/'+filename).

Я посмотрел на следующее, не придумав улучшения:

Альтернативаmatplotlib с акцентом на скорость - я изо всех сил пытался найти какие-либо примеры / документация контуров / участков поверхности с аналогичными требованиямиМногопроцессорная обработка - похоже, подобные вопросы, которые я видел здесь, требуютfig = plt.figure() а такжеax.imshow быть вызванным в цикле, так как рис и топор не могут быть засолены. В моем случае это будет дороже, чем любое увеличение скорости за счет реализации многопроцессорной обработки.

Буду признателен за любые идеи или предложения, которые вы можете иметь.

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

Ответы на вопрос(1)

Ваш ответ на вопрос