为什么Pickle协议4中的Pickle文件比协议3中的Pickle文件大两倍而速度却没有任何提高?

2024-06-16 09:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试Python3.4,我注意到pickle模块有一个新的协议。因此,我对2个协议进行了基准测试。在

def test1():
    pickle3=open("pickle3","wb")
    for i in range(1000000):
        pickle.dump(i,pickle3,3)
    pickle3.close()
    pickle3=open("pickle3","rb")
    for i in range(1000000):
        pickle.load(pickle3)

def test2():
    pickle4=open("pickle4","wb")
    for i in range(1000000):
        pickle.dump(i, pickle4,4)
    pickle3.close()
    pickle4=open("pickle4","rb")
    for i in range(1000000):
        pickle.load(pickle4)

test1 mark:2000007函数调用6.473秒

test2 mark:2000007函数调用6.740秒

协议4比协议3稍慢。这种差异是可以忽略的。然而,硬盘的使用情况确实不同。在

pickle3使用7868672字节。在

pickle4使用16868672字节。在

那不是理由。我继续挖掘。读了PEP3154之后,我大致了解了协议。在

对于协议3的元组(1,2,3,4,5,6,7)

^{pr2}$

对于协议4的元组(1,2,3,4,5,6,7)

    0: \x80 PROTO      4
    2: \x95 FRAME      18
   11: (    MARK
   12: K        BININT1    1
   14: K        BININT1    2
   16: K        BININT1    3
   18: K        BININT1    4
   20: K        BININT1    5
   22: K        BININT1    6
   24: K        BININT1    7
   26: t        TUPLE      (MARK at 11)
   27: \x94 MEMOIZE
   28: .    STOP

协议3的unpickler在读取到位置17之前无法知道数据的长度。在

对于方案4,从位置2到位置18,有一个显示长度的标题。在

然而,我仍然不明白为什么我要付出代价(在极端情况下几乎是硬盘使用量的两倍),但速度是相同的还是可能慢一些?


Tags: in协议forclosedefrangeopendump
1条回答
网友
1楼 · 发布于 2024-06-16 09:30:52

你在酸洗。对于这样一个简单的数据类型,预先知道结构的大小是没有好处的。对于更复杂的结构,知道帧大小可以极大地提高处理速度。此外,协议4解除了对64位系统的许多限制。在

相关问题 更多 >