为何Pickle序列化对象的大小远小于预期值?
为什么pickle序列化结果远小于理论值?
问题的核心原因是你创建的大列表里包含的是55个指向同一个小列表对象的引用,而非55个独立的浮点数列表,pickle的序列化机制会自动处理重复引用,避免重复存储相同内容。
具体拆解:
- 代码
[numpy.random.random(384).tolist()]*55中,numpy.random.random(384).tolist()仅执行一次,生成一个含384个浮点数的小列表;*55只是把这个小列表的引用复制了55次,最终大列表里的55个元素都是指向同一个小列表的指针。 - pickle序列化时会追踪对象引用:第一次遇到这个小列表时,会完整序列化它(对应你得到的3584字节);之后每遇到一次对它的引用,只写入一个极短的“引用标记”,而非重复序列化整个384个浮点数的列表。
如果要生成55个独立的列表,改用列表推导式即可:
len(pickle.dumps([numpy.random.random(384).tolist() for _ in range(55)]))
此时每个小列表都是全新对象,pickle会逐个序列化,结果会接近你计算的168960字节。
内容的提问来源于stack exchange,提问作者AlwaysLearning
相关产品推荐
相关产品推荐

