Я, вероятно, должен профилировать это, но мои навыки недостаточны.

вопрос является продолжением моего ответа вЭффективный способ вычисления матрицы Вандермонда.

Вот настройки:

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

Что может быть причиной этого резкого контраста во времени?

Ответы на вопрос(0)

Ваш ответ на вопрос