为什么嵌套字典减慢了numpy save?

时间:2018-05-08 11:02:13

标签: 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)

保存此数据需要很长时间。代码有问题,还是因为字典对象?

-----------------------更新-------------------- --------

通过将字典放在外面,即使数据大小相同,它也会快得多。所以似乎是字典会减慢这个过程。这有什么潜在的原因吗?

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)

1 个答案:

答案 0 :(得分:1)

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