python之序列化和压缩

什么时候使用序列化?

比如,我有一个很复杂的数据结构(类似字典,key和value是python的基本对象),我想把它存在数据库中。你准备怎么做,一项项拆分然后分别存储吗?答案,no。

现在可以用序列化来做,把这个数据结构直接转化成字节串,存在数据库中。恢复时,直接取出这个字节串,恢复字符串即可。

常用的是marshal和cPickle模块。

他们都是使用dump,dumps,load和loads方法。有专业测试说,marshal的速度要比cPickle快,但是也不尽然,cPickle是C写的,也超快,而且如果存在较长的字符串时,cPickle反而更快。

同时,cPickle可以与gzip一同使用,转换后压缩到最短的字节串,节省空间,进行存储。

 

import  cPickle,gzip
def  save(filename, * objects):
    fil 
=  gzip.open(filename, ' wb ' )
    
for  obj  in  objects:
        cPickle.dump(obj,fil,proto
= 2 )
    fil.close()
def  load(filename):
    fil 
=  gzip.open(filename, ' rb ' )
    
while  True:
        
try :
            yeild cPickle.load(fil)
        
except  EOFError: break
    fil.close()

比如处理45000个字符串的列表,cPickle在dump时使用协议0后,产生的磁盘文件大小为972KB,协议2则只需716KB。如果同时使用了gzip和协议2,产生的文件为268KB,但是协议0的压缩实际上是最好的,经测试,协议0和gzip产生的文件为252KB。

你可能感兴趣的:(python)