{转}python之序列化和压缩



python之序列化和压缩

转自:http://www.cnblogs.com/yd1227/archive/2011/03/15/1985407.html 

什么时候使用序列化?

比如,我有一个很复杂的数据结构(类似字典,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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值