我正在使用numpy版本1.14.3和python 2.7.12。
参考this问题,我发现使用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指出的那样,翻转初始化z
和e
的顺序将破坏相等性,因为它会覆盖相同的内存区域。
答案 0 :(得分:4)
np.empty
和np.zeros
做不同的事情。
np.empty
从可用的内存空间创建一个数组,将所有碰巧挂在内存中的值保留为这些值。 这些值可能为零,也可能不是零。
np.zeros
从可用的内存空间创建一个数组,然后为您选择的dtype用零填充。显然np.zeros
必须做更多的工作,因此它应该更慢,因为它还会写入分配的内存。
在np.empty
和np.ndarray
之间进行更公平的比较。