Время для извлечения строки в np.array

При оптимизации части кода в Python я заметил следующее:

x = np.random.randn(100, 20)
a = np.arange(20)
%timeit x

23 нано сек

%timeit x[a]

1,7 микросекунды

Хотя x [a] является меньшим массивом, для его получения требуется больше времени. Знаете ли вы, что может вызвать это? Аналогичные результаты наблюдаются, если вместо x я запрашиваю xTdot(x) и x[a].T.dot(x[a]).

2 ответа

Решение

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

Другие вопросы по тегам