Я, вероятно, должен профилировать это, но мои навыки недостаточны.
вопрос является продолжением моего ответа вЭффективный способ вычисления матрицы Вандермонда.
Вот настройки:
x = np.arange(5000) # an integer array
N = 4
Теперь я вычислюМатрица Вандермонда двумя разными способами:
m1 = (x ** np.arange(N)[:, None]).T
А также,
m2 = x[:, None] ** np.arange(N)
Санитарная проверка:
np.array_equal(m1, m2)
True
Эти методы идентичны, но их производительность не является:
%timeit m1 = (x ** np.arange(N)[:, None]).T
42.7 µs ± 271 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit m2 = x[:, None] ** np.arange(N)
150 µs ± 995 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Итак, первый метод, несмотря на необходимость транспонирования в конце, все ещеболее чем в 3 раза быстрее чем второй метод.
Разница лишь в том, что в первом случаеменьше массив передается, тогда как во втором случае этобольше.
Итак, с довольно приличным пониманием того, как работает numpy, я могу предположить, что ответом будет кеш. Первый метод намного более дружественен к кешу, чем второй. Тем не менее, я хотел бы получить официальное слово от кого-то с большим опытом, чем я.
Что может быть причиной этого резкого контраста во времени?