嵌套字典为何拖慢numpy.save速度?附代码场景技术问询
为什么内层嵌套字典会让NumPy保存数据慢到离谱?
兄弟,你这个问题我太有共鸣了——之前用类似的嵌套结构存数据,也差点等得怀疑人生!核心原因就是NumPy对大量零散嵌套字典的序列化效率极低,而把字典结构移到外层后,数据变成了更规整的数组形式,刚好踩中了NumPy的优化点。
具体原因拆解
- 零散小对象的序列化开销:你原来的代码在最内层循环里,每次都创建一个新的
{'a': ..., 'b': ...}字典,最后总共生成了200*300=60000个独立的字典对象。NumPy在保存.npy文件时,需要逐个遍历这些字典,处理每个字典里的数组,光是遍历和序列化这些零散对象的开销就占了大头,完全发挥不出它处理连续数组的优势。 - 规整数组的高效处理:当你把字典移到外层后,相当于把所有
'a'对应的数组整合成一个大的多维数组(比如形状是(200, 300, 64, 64, 3)),'b'同理。NumPy对这种同质的、连续内存的数组结构有极强的优化,序列化时可以直接批量处理整块内存,速度自然快了N倍。
优化后的代码示例
给你写个参考版本,把字典移到外层,用两个大数组存储数据:
import numpy as np # 直接创建两个大数组,避免内层循环生成字典 a_data = np.random.randn(200, 300, 64, 64, 3) b_data = np.random.randn(200, 300, 64, 64, 3) # 把数组打包成一个字典后保存 D = {'a': a_data, 'b': b_data} np.save('data_optimized', D)
这样保存的速度会和你调整后的效果一致,而且数据结构更规整,后续加载和使用也更方便。
内容的提问来源于stack exchange,提问作者Xingdong
相关产品推荐
相关产品推荐

