Отслеживание кода numpy
C - медленный и утомительный процесс. Я предпочитаю выводить модели поведения из времени.
Создать образец массива и его транспонировать:
In [168]: A = np.random.rand(1000,1000)
In [169]: At = A.T
Сначала быстрый просмотр - копирование буфера данных не выполняется:
In [171]: timeit B = A.ravel()
262 ns ± 4.39 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Быстрое копирование (предположительно использует быстрое копирование памяти блока):
In [172]: timeit B = A.copy()
2.2 ms ± 26.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Медленная копия (предположительно, требует прохождения источника в его пошаговом порядке и цели в своем собственном порядке):
In [173]: timeit B = A.copy(order='F')
6.29 ms ± 2.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Копирование At
без необходимости изменения порядка - быстро:
In [174]: timeit B = At.copy(order='F')
2.23 ms ± 51.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Подобно [173], но переход от «F» к «C»:
In [175]: timeit B = At.copy(order='C')
6.29 ms ± 4.16 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [176]: timeit B = At.ravel()
6.54 ms ± 214 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Копии с более простым пошаговым переупорядочением находятся где-то посередине:
In [177]: timeit B = A[::-1,::-1].copy()
3.75 ms ± 4.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [178]: timeit B = A[::-1].copy()
3.73 ms ± 6.48 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [179]: timeit B = At[::-1].copy(order='K')
3.98 ms ± 212 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Для этого astype
также требуется более медленное копирование:
In [182]: timeit B = A.astype('float128')
6.7 ms ± 8.12 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
PyArray_NewFromDescr_int
описывается как Generic new array creation routine.
Хотя я не могу понять, куда он копирует данные из источника в цель, он явно проверяет order
и strides
и dtype
. Предположительно, он обрабатывает все случаи, когда требуется общая копия. Перестановка осей не является частным случаем.