ead*_*ead 7 python performance numpy
测量内存消耗时np.zeros:
import psutil
import numpy as np
process = psutil.Process()
N=10**8
start_rss = process.memory_info().rss
a = np.zeros(N, dtype=np.float64)
print("memory for a", process.memory_info().rss - start_rss)
Run Code Online (Sandbox Code Playgroud)
结果是意外的8192字节,即几乎为 0,而 1e8 双倍将需要 8e8 字节。
当更换np.zeros(N, dtype=np.float64)由np.full(N, 0.0, dtype=np.float64)所需存储器a是800002048字节。
运行时间也有类似的差异:
import numpy as np
N=10**8
%timeit np.zeros(N, dtype=np.float64)
# 11.8 ms ± 389 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.full(N, 0.0, dtype=np.float64)
# 419 ms ± 7.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
即np.zeros对于大尺寸,速度最高可达 40 倍。
不确定这些差异是否适用于所有架构/操作系统,但我至少在 x86-64 Windows 和 Linux 上观察到了这一点。
np.zeros和之间的哪些差异np.full可以解释不同的内存消耗和不同的运行时间?
numpy.zeros函数直接使用Numpy库的C代码层,而函数ones和full的工作方式相同,通过初始化值数组并在其中复制所需的值。
那么Zeros函数不需要任何语言解释,而对于其他函数、ones和full,Python 代码需要解释为 C 代码。
看一下源代码,自己弄清楚:https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |