Чтобы сделать этот код быстрым, вам нужно «векторизовать» его: заменить все явные петли Python неявными петлями, используя правила boradcasting NumPy.Я могу попытаться дать векторизованную версию вашего цикла:
if self.color_array is None:
self.color_array = numpy.empty((len(activity), 4))
diff_activity = (activity - self.min) / abs_diff
self.color_array[:, :3] = (start_colors +
diff_activity[:, numpy.newaxis] +
end_colors)
self.color_array[:, 3] = 1
Обратите внимание, что мне пришлось много гадать, так как я не уверен, каковы все ваши переменные и что должен делать кодсделать, поэтому я не могу гарантировать, что этот код работает.Я превратил color_array
в двумерный массив, так как это кажется более подходящим.Это, вероятно, требует изменений в других частях кода (или вам нужно снова сгладить массив).
Я предполагаю, что self.min
и abs_diff
являются скалярами, а все другие имена ссылаются на массивы NumPy следующих форм:
activity.shape == (len(vertices) // 3,)
start_colors.shape == (3,)
end_colors.shape == (3,)
Выглядит так, как будто vertices
является одномерным массивом и должен быть двумерным массивом.