gpt4 book ai didi

python - 为什么 Pickle 协议(protocol) 4 中的 Pickle 文件是协议(protocol) 3 中的文件的两倍大,而速度却没有任何提升?

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:03 24 4
gpt4 key购买 nike

我正在测试 Python 3.4,我注意到 pickle 模块有一个新的协议(protocol)。因此,我对 2 个协议(protocol)进行了基准测试。

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 次函数

Protocol 4 比Protocol 3 稍微慢一些。这种差异可以忽略。但是,硬盘使用情况确实不同。

pickle3 使用 7,868,672 字节。

pickle4 使用 16,868,672 字节。

这不是理由。我继续挖掘。看完PEP3154 , 我大致了解协议(protocol)。

对于协议(protocol) 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

对于协议(protocol) 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

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

对于协议(protocol)4,从位置2到位置18,有一个标题显示长度。

但是,我还是不明白为什么我付出了代价(在极端情况下几乎是硬盘使用量的两倍)但是速度是一样的或者可能更慢?

最佳答案

你正在腌制整数。对于这种简单的数据类型,提前知道结构的大小没有任何好处。对于更复杂的结构,了解帧大小可以极大地提高处理速度。此外,协议(protocol) 4 解除了对 64 位系统的许多限制。

关于python - 为什么 Pickle 协议(protocol) 4 中的 Pickle 文件是协议(protocol) 3 中的文件的两倍大,而速度却没有任何提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24097507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com