Заставить Matplotlib работать быстрее - PullRequest
5 голосов
/ 15 ноября 2010

Отрывок:

ax = Axes3D(self.fig)

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = self.prop * np.outer(np.cos(u), np.sin(v))
y = self.prop * np.outer(np.sin(u), np.sin(v))
z = self.prop * np.outer(np.ones(np.size(u)), np.cos(v))

t = ax.plot_surface(x, y, z, rstride=6, cstride=6,color='lightgreen',linewidth=0)
self.canvas.draw()

Приведенный выше фрагмент строит график сферы в tkinter с использованием matplotlib. Я обнаружил, что более высокие значения rstride и cstride позволяют графику иметь немного лучшую производительность. Однако они придают сфере странную ребристую форму. Мне было интересно, что еще можно изменить в приведенном выше коде, чтобы повысить производительность.

Ответы [ 3 ]

13 голосов
/ 15 ноября 2010

Действительно, проблема больше в plot_surface.Есть много вещей, которые можно сделать, чтобы улучшить его.Например, затенение занимает много времени и просто изменив одну строку:

colors = [color * (0.5 + norm(v) * 0.5) for v in shade]

на

colors = np.outer(0.5+norm(shade)*0.5,color)

в одной из функций, используемых plot_surface, я получилсокращение примерно на 28% в общем времени выполнения.Зачем?Функция norm (ну, класс) настроена для векторизации, но не использовалась таким образом.Я знаю, что есть много таких вещей в этих функциях, которые не очень оптимальны.Изменение двух строк:

for rs in np.arange(0, rows-1, rstride):
    for cs in np.arange(0, cols-1, cstride):

на

for rs in xrange(0,rows-1,rstride):
    for cs in xrange(0,cols-1,cstride):

в самой функции plot_surface дает еще одно существенное улучшение - теперь мы сократились на 33% по сравнению с исходным временем выполнения.

Из того, что я видел, код на самом деле написан не столько для эффективности, сколько для того, чтобы заставить его работать из того, что я могу сказать - есть много мест, где вещи, которые можно было бы сделать более векторизованными, используяNumpy и нет.Боюсь, что на самом деле нужна некоторая оптимизация функций matplotlib.

1 голос
/ 15 ноября 2010

На данный момент это пакет визуализации, который имеет узкое место.Количество точек определено и постоянно.

Попробуйте, если использование psyco может ускорить его (хотя это только 32-битная версия).

0 голосов
/ 15 ноября 2010

Я не уверен, что это поможет, но, возможно, вы могли бы попробовать другой сервер рендеринга для matplotlib. Но, возможно, один из них даст вам лучшую производительность.

http://matplotlib.sourceforge.net/faq/installing_faq.html#what-is-a-backend

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