相关疑难解决方法(0)

怎么腌自己?

我希望我的类能够实现Save和Load函数,这些函数只是简单地修改了类.但显然你不能在下面的时尚中使用'self'.你怎么能这样做?

self = cPickle.load(f)

cPickle.dump(self,f,2)
Run Code Online (Sandbox Code Playgroud)

python pickle

55
推荐指数
4
解决办法
2万
查看次数

如何减少在python中加载pickle文件所花费的时间

我已经在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 performance pickle

30
推荐指数
3
解决办法
3万
查看次数

Python Pickle 格式在哪里正式定义?

Python语言在《Python语言参考》( 1 )中正式定义,其中包含有关Python源代码语法的详细信息。“Python 标准库”( 2 ) 参考对 Python 标准库做了类似的事情,包括 Pickle 模块 ( 3 )。然而,本文档实际上并没有解释 Pickle 格式的结构。

根据 的输出pickletools以及阅读格式的一些解释,很明显 Pickle 是:

一个基于堆栈的虚拟机,用于跟踪对象。该文件只是序列化操作码的列表,第一个预计是协议版本,最后一个是停止操作码。当满足停止操作码时,堆栈中的当前对象被弹出。(4)。

据我所知,这个结构和实际的操作码列表实际上都没有被任何官方 Python 文档正式定义。某些 PEP ( 5 ) ( 6 ) ( 7 ) 描述了在规范的较新版本中添加的操作码,但原始操作码列表无处可寻。

Pickle 格式在哪里正式定义?只是Python源代码吗?如果这是真的,那么如果标准库没有正式规范,如何创建新的 Python 实现呢?

python pickle

7
推荐指数
0
解决办法
713
查看次数

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

我正在测试 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)

python python-3.x

6
推荐指数
1
解决办法
796
查看次数

标签 统计

python ×4

pickle ×3

performance ×1

python-3.x ×1