pickle 模块可以看作是cPickle 的python实现,cPick效率肯定比pickle快的多。但是cPick是一些函数块,并不是类,所以不能被子类化。大多数情况下不需要cPickle。 两者的模块接口几乎都一样!
python 包含一个更原始的序列化模块marshal ,但是我们经常需要用pickle来序列化对象。marshal 主要用于支持.pyc文件
pickle 和python 主要区别
1.pickle 模块会跟踪已经被序列化的对象,以便稍后对同一对象的引用不再被序列化,marshal 则不是!
这对于递归对象和对象共享都有影响。递归对象包含对自身的引用的对象,marshal 不会处理这些,所以传递归对象会使python解释器崩溃!我们实际对同一对象多次引用序列化时,pickle 只会存储一次,并且确保所有引用指向主副本,共享保持对象,这对于可变对象来说很实用
2.marshal 不能用于序列化用户定义的类及其实例。pickle可以透明的保存和恢复类的实例。前提是类定义必须是可导入的,并且存储在和该对象相同的模块中。
3.marshal序列化格式是不能保证整个Python版本移植。由于其主要的工作是支持.pyc文件,Python实现者保留在需要时以非向后兼容的方式更改序列化格式的权利。pickle序列化格式是保证不同的Python版本向后兼容。
pickle 保存的格式目前分3种
1.protocol 协议 值为True 时是存储ASCII格式,向后兼容早期python版本
2.protocol 协议值为False 时是存储为二进制格式,兼容早期python版本
3.没研究明白 -_-!
用法
1.写入读取文件
pickle.dump(obj,file,protocol)
obj 所要存储的对象
file pickle 形势打开的对象文件 open('fileName','w/r')
protocol 就是上面所说的三种格式
pickle.load(file)
2.直接以特定格式返回
pickle.dumps(obj,protocol)
3.那些类可以进行pickle持久化
1.None、True、False
2.整形、长整形、浮点数、复数
3.字符串和unicode 字符串
4.元组、列表、集合、可选对象的字典
5.在模块顶层定义的功能、内置函数、类
6.这些类的实例__dict__或其调用结果__getstate__()是可选的