Этот вопрос является продолжением моего ответа в Эффективный способ вычисления матрицы Вандермонда.
Здесь настройка:
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, я могу догадаться, что ответ будет включать кеш. Первый метод - это гораздо более дружественный кэш чем второй. Тем не менее, я хотел бы получить официальное слово от кого-то с больше опыта, чем я.
Что может быть причиной этого резкого контраста в таймингах?