我正在测试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,有一个显示长度的标题。在
然而,我仍然不明白为什么我要付出代价(在极端情况下几乎是硬盘使用量的两倍),但速度是相同的还是可能慢一些?
你在酸洗。对于这样一个简单的数据类型,预先知道结构的大小是没有好处的。对于更复杂的结构,知道帧大小可以极大地提高处理速度。此外,协议4解除了对64位系统的许多限制。在
相关问题 更多 >
编程相关推荐