首页 > 解决方案 > 为什么嵌套字典会减慢 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)

标签: pythonnumpy

解决方案


这是执行类似操作的代码,但以高效、矢量化的方式,没有慢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 时间为代价)。


推荐阅读