np.zeros 和 np.full 内存消耗和性能差异的原因

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)所需存储器a800002048字节。

运行时间也有类似的差异:

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可以解释不同的内存消耗和不同的运行时间?

Lau*_*IER 1

numpy.zeros函数直接使用Numpy库的C代码层,而函数onesfull的工作方式相同,通过初始化值数组并在其中复制所需的值。

那么Zeros函数不需要任何语言解释,而对于其他函数、onesfull,Python 代码需要解释为 C 代码。

看一下源代码,自己弄清楚:https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py