Из документации numpy.copy
:
Это эквивалентно:
>>> np.array(a, copy=True)
Кроме того, если вы посмотрите на исходный код :
def copy(a, order='K'):
return array(a, order=order, copy=True)
Некоторые временные параметры:
In [1]: import numpy as np
In [2]: a = np.ascontiguousarray(np.random.randint(0, 20000, 1000))
In [3]: %timeit b = np.array(a)
562 ns ± 10.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %timeit b = np.array(a, order='K', copy=True)
1.1 µs ± 10.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [5]: %timeit b = np.copy(a)
1.21 µs ± 9.28 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [6]: a = np.ascontiguousarray(np.random.randint(0, 20000, 1000000))
In [7]: %timeit b = np.array(a)
310 µs ± 6.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [8]: %timeit b = np.array(a, order='K', copy=True)
311 µs ± 2.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [9]: %timeit b = np.copy(a)
313 µs ± 4.33 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [10]: print(np.__version__)
1.13.3
Неожиданно, что простая явная установка параметров в их значения по умолчанию изменяет скорость выполненияnp.array()
.С другой стороны, возможно, просто обработка этих явных аргументов добавляет достаточно времени выполнения, чтобы иметь значение для небольших массивов.Действительно, из исходного кода для numpy.array()
видно, что при предоставлении аргументов ключевого слова выполняется намного больше проверок и выполняется больше обработки, например, см. goto full_path
.Если параметры ключевого слова не установлены, выполнение полностью пропускается до goto finish
.Эти издержки (дополнительной обработки аргументов ключевых слов) - это то, что вы обнаруживаете в таймингах для небольших массивов.Для больших массивов эти издержки незначительны по сравнению с фактическим временем копирования массивов.