首页 > 解决方案 > np.empty 与 np.zeros 的速度

问题描述

我正在使用 numpy 版本 1.14.3 和 python 2.7.12。

参考这个问题,我发现使用 np.zeros 和 np.empty 初始化数组之间的速度差异很大。但是,输出是相同的。

import numpy as np
r = np.random.random((50, 100, 100))
z = np.zeros(r.shape)
e = np.empty(r.shape)
np.allclose(e, z)

这返回True。然而,计时函数%timeit给出了非常不同的结果:

%timeit z = np.zeros(r.shape)

10000 次循环,3 次中的最佳:每个循环 143 µs

%timeit e = np.empty(r.shape)

1000000 次循环,3 次中的最佳:每个循环 1.83 µs

上面引用的先前接受的答案说这np.zeros总是更好的选择,而且它也更快。

当 np.empty 比 np.zeros 快 80 倍并返回相同的答案时,为什么不使用它?

编辑 正如 user2285236 指出的那样,翻转初始化顺序ze破坏相等性,因为它会覆盖相同的内存区域。

标签: pythonpython-2.7numpy

解决方案


np.emptynp.zeros做不同的事情。

np.empty从可用内存空间创建一个数组,将恰好在内存中的任何值作为值保留。 这些值可能是也可能不是零。

np.zeros从可用内存空间创建一个数组,然后为您选择的 dtype 填充零。显然np.zeros必须做更多的工作,所以它应该更慢,因为它也在写入分配的内存。

更公平的比较是np.emptynp.ndarray


推荐阅读