Время извлечения строк в 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 2

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 указанных строк в новый массив. Делать что-то намного труднее, чем ничего не делать.