我正在测试Python3.4,我注意到泡菜模块有一个新的协议。因此,我对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标记: 6.473秒内调用2000007次函数
test2标记: 6.740秒内调用2000007次函数
协议4比协议3稍慢,这种差异可以忽略。然而,硬盘的使用确实是不同的。
pickle3使用7,868,672字节。
pickle4使用16,868,672字节。
这不是理由。我继续挖掘。在阅读了PEP3154之后,我大致理解了协议。
第3号议定书(1,2,3,4,5,6,7)
0: \x80 PROTO 3
2: ( MARK
3: K BININT1 1
5: K BININT1 2
7: K BININT1 3
9: K BININT1 4
11: K BININT1 5
13: K BININT1 6
15: K BININT1 7
17: t TUPLE (MARK at 2)
18: q BINPUT 0
20: . STOP第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的解拾取器在读取到位置17之前无法知道数据的长度。
对于协议4,从位置2到位置18,有一个显示长度的标题。
然而,我仍然不明白为什么我要付出代价(在极端情况下几乎是硬盘使用量的两倍),但是速度是相同的,或者可能更慢?。
发布于 2014-06-07 13:11:42
你在泡菜。对于这样一个简单的数据类型,提前知道结构的大小是没有好处的。对于更复杂的结构,了解帧大小是一个巨大的提高处理速度。此外,协议4解除了对64位系统的许多限制。
https://stackoverflow.com/questions/24097507
复制相似问题