sen*_*cer 8 python arrays numpy
我想知道使用b = np.array(a)
而不是b = np.copy(a)
将Numpy数组复制a
到b中是否有任何缺点.当我%timeit
,前者可以快100%.
在这两种情况下b is a
是False
的,我可以操纵b
留下a
完整的,所以我想这个做什么是由预期.copy()
.
我错过了什么吗?使用np.array
复制数组有什么不妥之处?
使用python 3.6.5,numpy 1.14.2,而速度差异因较大尺寸而迅速关闭:
a = np.arange(1000)
%timeit np.array(a)
501 ns ± 30.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.copy(a)
1.1 µs ± 35.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Run Code Online (Sandbox Code Playgroud)
来自以下文件numpy.copy
:
这相当于:
Run Code Online (Sandbox Code Playgroud)>>> np.array(a, copy=True)
另外,如果你看一下源代码:
def copy(a, order='K'):
return array(a, order=order, copy=True)
Run Code Online (Sandbox Code Playgroud)
一些时间:
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
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,只需将参数显式设置为默认值就会改变执行速度np.array()
.另一方面,也许只是处理这些显式参数会增加足够的执行时间来为小数组做出改变.实际上,从源代码中numpy.array()
可以看出,当提供关键字参数时,还会执行更多检查和更多处理,例如,请参阅goto full_path
.如果未设置关键字参数,则执行会一直跳到goto finish
.这种开销(关键字参数的附加处理)是您在小数组的时序中检测到的.对于较大的阵列,与复制阵列的实际时间相比,这种开销是微不足道的.