假设我们有以下代码
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)
答案 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时间为代价)。