python - 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 指出的那样,翻转初始化顺序z
会e
破坏相等性,因为它会覆盖相同的内存区域。
解决方案
np.empty
并np.zeros
做不同的事情。
np.empty
从可用内存空间创建一个数组,将恰好在内存中的任何值作为值保留。 这些值可能是也可能不是零。
np.zeros
从可用内存空间创建一个数组,然后为您选择的 dtype 填充零。显然np.zeros
必须做更多的工作,所以它应该更慢,因为它也在写入分配的内存。
更公平的比较是np.empty
和np.ndarray
。
推荐阅读
- python - Python:匹配文件中的多个模式
- c# - 仅当存在时,如何通过键原子更新 ConcurrentDictionary 中的值
- vuejs2 - Nuxt Ava 端到端测试存储配置
- mysql - 是双右插入符语法 >> mysqldump 的有效 MySQL
- javascript - 为什么我的 JavaScript 代码在我的 ASP.NET Web 表单页面上不起作用?
- javascript - 将一个空数组保存到 mongodb
- node.js - 每个 npm install 都会给出“npm ERR!仅支持绝对 URL”
- javascript - REACTJS 将变量传递给 props
- python - 使用 python 请求的奇怪的间歇性发布问题
- javascript - 在新选项卡(相同域)中打开 iframe 中的所有链接