Время для извлечения строки в np.array - PullRequest
0 голосов
/ 14 мая 2018

При оптимизации части кода в 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 ]

0 голосов
/ 14 мая 2018

Несмотря на то, что ваш контрольный пример с заголовками некорректен, 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
0 голосов
/ 14 мая 2018

%timeit x раз, сколько нужно времени, чтобы ничего не делать с x. Довольно легко ничего не делать.

%timeit x[a] раз, сколько времени требуется, чтобы действительно что-то сделать с x, когда эта вещь динамически определяет, что означает операция индексации, а затем копирует 20 указанных строк в новый массив. Делать вещи намного сложнее, чем ничего не делать.

...