python - 复制numpy数组的速度
问题描述
我想知道使用b = np.array(a)
而不是b = np.copy(a)
将 Numpy 数组复制a
到 b 中是否有任何缺点。当 I%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
:
这相当于:
>>> 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
. 这种开销(关键字参数的额外处理)是您在小数组的计时中检测到的。对于较大的数组,与复制数组的实际时间相比,这种开销是微不足道的。
推荐阅读
- php - Lumen (5.8.7) - 路由中的最终参数包括斜杠
- ios - 具有 OpenSSL 通用依赖的 Swift 框架
- chart.js - 在 Chart.js 中使用刻度“主要”与未知文本重叠
- javascript - 操作员问题 Javascript
- vuejs2 - 使用 KEYCLOAK 确保 thorntail 服务
- ios - 为什么我不能与子视图交互?
- postgresql - 使用带有时区的 generate_series
- python - 实现一个基本的神经网络来预测 y = 2x
- python-3.x - 如何有效地绘制 matplotlib 的这段代码
- excel - 根据月份和客户将文件保存到文件夹的宏