python - 为什么嵌套字典会减慢 numpy 保存速度?
问题描述
假设我们有以下代码
import numpy as np
D = []
for _ in range(200):
d = []
for _ in range(300):
d.append({'a': np.random.randn(64, 64, 3), 'b': np.random.randn(64, 64, 3)})
D.append(d)
np.save('data', D)
保存这些数据需要很长时间。代码有问题,还是因为字典对象?
- - - - - - - - - - - -更新 - - - - - - - - - - - - - --
通过将字典放在外面,即使数据大小相同,它也会显着加快。所以似乎是字典减慢了这个过程。有什么潜在的原因吗?
IE
import numpy as np
D1 = []
D2 = []
for _ in range(200):
d1 = []
d2 = []
for _ in range(300):
d1.append(np.random.randn(64, 64, 3))
d2.append(np.random.randn(64, 64, 3))
D1.append(d1)
D2.append(d2)
np.save('d1', D1)
np.save('d2', D2)
解决方案
这是执行类似操作的代码,但以高效、矢量化的方式,没有慢for
循环:
np.savez('data',
a=np.random.randn(200, 300, 64, 64, 3),
b=np.random.randn(200, 300, 64, 64, 3))
输出格式有点不同——它更紧凑,读回效率更高。
请注意,这几乎是 12 GB 的数据,因此生成随机数并将它们写入磁盘当然需要一段时间。如果您的真实数据的熵低于随机数,您可以考虑使用savez_compressed()
来启用压缩并节省一些磁盘空间(以保存和加载时的 CPU 时间为代价)。
推荐阅读
- python - 从特定页面抓取特定 URL
- jupyter-notebook - 无法启动内核 [Errorno 2] Jupyter Notebook
- regex - 正则表达式:计算不同地方的出现次数
- javascript - 动态循环多维数组并展平其中的对象
- javascript - 使用 Office JS Api 从 Word 文档的文本框中提取文本
- aws-amplify - AWS APPSYNC 如何应用 aws_api_key 授权
- javascript - 恢复被覆盖的字符串原型
- python - 可视化 google quickdraw 数据
- javascript - 如何使用 HighCharts 库实现这一点
- android - 将本地 .aar 文件添加到 Titanium SDK 9 Android 模块