转自: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()
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。