Как мне увеличить скорость прорисовки в питоне? - PullRequest
3 голосов
/ 21 сентября 2011

У меня есть массив данных размером 256x256, который постоянно меняется.на каждой итерации я делаю снимок, чтобы сделать фильм.Снимок - это трехмерный график поверхности, созданный с использованием matplotlib.

. Проблема в том, что построение графика обходится мне> 2 секунды на каждую итерацию, что составляет около 600 секунд на 250 итераций.У меня была та же программа, работающая в MATLAB, и это было 80-120 секунд для того же количества итераций.

Вопрос: есть ли способы ускорить matplotlib трехмерное построение поверхности или есть более быстрые инструменты дляpython?

Вот часть кода:

## initializing plot

fig = plt.figure(111)
fig.clf()
ax = fig.gca(projection='3d')
X = np.arange(0, field_size, 1)
Y = np.arange(0, field_size, 1)
X, Y = np.meshgrid(X, Y)

## the loop

start_time = time.time()
for k in xrange(250):
    it_time = time.time()
    field[128,128] = maxvalue
    field = scipy.ndimage.convolve(field, kernel)
    print k, " calculation: ", time.time() - it_time, " seconds"
    it_time = time.time()
    ax.cla()
    ax.plot_surface(X, Y, field.real, rstride=4, cstride=4, cmap=cm.hot,
        linewidth=0, antialiased=False)
    ax.set_zlim3d(-50, 150)
    filename = "out_%d.png" % k
    fig.savefig(filename)
    #fig.clf()
    print k, " plotting: ", time.time() - it_time, " seconds"
print "computing: ", time.time() - start_time, " seconds"

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Для 3D-печати вообще я бы посоветовал mayavi .Поначалу это может показаться немного сложным, но оно того стоит.

Это, конечно, намного быстрее, чем matplotlib для построения одного кадра 3D-данных.Я не уверен, что для многократного построения графика с помощью вызова savefig ...

0 голосов
/ 21 сентября 2011

Я не могу проверить, помогает ли это, поскольку вы не предоставили работоспособный пример, но вы можете видеть, быстрее ли изменение Poly3DCollection, возвращаемое plot_surface, чем создание новой коллекциивремя.

Кроме того, вы используете неинтерактивный бэкэнд, верно?(Позвоните matplotlib.use('agg') перед импортом pyplot.)

0 голосов
/ 21 сентября 2011

GNUplot (доступ через различные интерфейсы python ) может быть быстрее.По крайней мере, я знал кого-то несколько лет назад с такой же проблемой, как у вас, и после тестирования ряда пакетов они пошли с GNUplot.Хотя он выглядит не так хорошо, как matplotlib.

Кроме того, я предполагаю, что у вас отключен интерактивный режим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...