我希望我的类能够实现Save和Load函数,这些函数只是简单地修改了类.但显然你不能在下面的时尚中使用'self'.你怎么能这样做?
self = cPickle.load(f)
cPickle.dump(self,f,2)
Run Code Online (Sandbox Code Playgroud) 我已经在python中创建了一个字典并将其转换为pickle.它的大小达到了300MB.现在,我想加载相同的泡菜.
output = open('myfile.pkl', 'rb')
mydict = pickle.load(output)
Run Code Online (Sandbox Code Playgroud)
加载这个泡菜大约需要15秒.我怎样才能减少这个时间?
硬件规格:Ubuntu 14.04,4GB RAM
下面的代码显示了使用json,pickle,cPickle转储或加载文件所需的时间.
转储后,文件大小约为300MB.
import json, pickle, cPickle
import os, timeit
import json
mydict= {all values to be added}
def dump_json():
output = open('myfile1.json', 'wb')
json.dump(mydict, output)
output.close()
def dump_pickle():
output = open('myfile2.pkl', 'wb')
pickle.dump(mydict, output,protocol=cPickle.HIGHEST_PROTOCOL)
output.close()
def dump_cpickle():
output = open('myfile3.pkl', 'wb')
cPickle.dump(mydict, output,protocol=cPickle.HIGHEST_PROTOCOL)
output.close()
def load_json():
output = open('myfile1.json', 'rb')
mydict = json.load(output)
output.close()
def load_pickle():
output = open('myfile2.pkl', 'rb')
mydict = pickle.load(output)
output.close()
def …Run Code Online (Sandbox Code Playgroud) Python语言在《Python语言参考》( 1 )中正式定义,其中包含有关Python源代码语法的详细信息。“Python 标准库”( 2 ) 参考对 Python 标准库做了类似的事情,包括 Pickle 模块 ( 3 )。然而,本文档实际上并没有解释 Pickle 格式的结构。
根据 的输出pickletools以及阅读格式的一些解释,很明显 Pickle 是:
一个基于堆栈的虚拟机,用于跟踪对象。该文件只是序列化操作码的列表,第一个预计是协议版本,最后一个是停止操作码。当满足停止操作码时,堆栈中的当前对象被弹出。(4)。
据我所知,这个结构和实际的操作码列表实际上都没有被任何官方 Python 文档正式定义。某些 PEP ( 5 ) ( 6 ) ( 7 ) 描述了在规范的较新版本中添加的新操作码,但原始操作码列表无处可寻。
Pickle 格式在哪里正式定义?只是Python源代码吗?如果这是真的,那么如果标准库没有正式规范,如何创建新的 Python 实现呢?
我正在测试 Python 3.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)
Run Code Online (Sandbox Code Playgroud)
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 …Run Code Online (Sandbox Code Playgroud)