gpt4 book ai didi

python - 复制numpy数组的速度

转载 作者:太空狗 更新时间:2023-10-29 21:02:13 24 4
gpt4 key购买 nike

我想知道使用 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)

最佳答案

来自 numpy.copy 的文档:

This is equivalent to:

>>> np.array(a, copy=True)

此外,如果您查看 source code :

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() 的执行速度。另一方面,也许只是处理这些显式参数会增加足够的执行时间,从而对小型数组产生影响。事实上,来自 source code for the numpy.array() , 可以看到当提供关键字参数时有更多的检查和更多的处理正在执行,例如,参见 goto full_path .当没有设置关键字参数时,执行一直跳到goto finish。 .这种开销(关键字参数的额外处理)是您在小型数组的计时中检测到的。对于较大的数组,与复制数组的实际时间相比,此开销微不足道。

关于python - 复制numpy数组的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com