Время извлечения строк в np.массив
При оптимизации части кода в python я заметил следующее:
x = np.random.randn(100, 20)
a = np.arange(20)
%timeit x
23 нано сек
%timeit x[a]
1.7 МКС
Хотя x[a] является меньшим массивом, для его достижения требуется больше времени. Пожалуйста, вы знаете, что может вызвать это ? Аналогичные результаты наблюдаются, если вместо x я попрошу x.T. dot (x) и x[a].Точка(x[a]).
2 ответа:
В то время как ваш заголовок testcase имеет недостатки,
x
будучи просто ссылкой, ваше наблюдение стоит, если менее экстремально дляТо, что мы видим здесь, - это стоимость расширенной индексации. "Обычная" индексация среза стоит значительно меньше, но все же имеет накладные расходы:>>> timeit(lambda: x[a], number=1000000) 1.8212362979538739 >>> timeit(lambda: x.copy(), number=1000000) 1.2187692462466657
>>> np.all(x[:20] == x[a]) True >>> timeit(lambda: x[:20].copy(), number=1000000) 0.7956113098189235
%timeit x
умножьте на то, сколько времени требуется, чтобы ничего не делать сx
. Довольно легко ничего не делать.
%timeit x[a]
умножьте время, которое требуется, чтобы действительно сделать что-то сx
, то есть динамически определить, что означает операция индексирования, а затем скопировать 20 указанных строк в новый массив. Делать что-то намного труднее, чем ничего не делать.