python 小知识 -python 序列化
1. 什么是序列化
有时候,我们希望存储或者传输不只是数据,而是一些内存中的对象和数据结构,以便在远程或者其他进程中可以直接使用相同的对象。
常见的场景有,在数据分析过程中,通常模型训练是离线的,而预测时线上的,而同时也需要不断的更新模型到线上来预测;所以当我们训练好一个机器学习的模型时需要保存这个模型的内存中对象(包括上下文的状态信息),以便可以用来做预测;在分布式计算时,如 spark 内存分布式计算框架,在集群之间需要进行大量的对象传输;
这里的将内存中对象存储的过程就是序列化,而在其他进程中使用这个对象的过程是反序列化。
更简单的说,序列化就是把内存中的数据结构在不丢失其身份和类型信息的情况下转成对象的文本或二进制表示的过程。而反序列化就是将对象的文本或者二进制还原成原始对象的过程。
2. python 的序列化
python 中提供需要方法支持序列化,比较常用的 pickle 和 json
其中序列化的过程是 dump,反序列化的过程是 load
我们来看看
pickle 几乎支持 python 所有的对象,包括布尔、数字、字符串、字节数组、None、列表、元组、字典和集合等基本数据类型,picike 还能够处理循环,递归引用对象、类、函数以及类的实例等
pickle 有一个 C 的实现即 Cpickle,区别就是速度,Cpickle 的速度是 pickle 的 1000 倍import cPickle as pickle
3.python 序列化的缺点
首先 pickle 是 python 的包,pickle 序列化对象只能在 python 环境中使用,不能跨语言
pickle 可能存在安全性问题
跨语言的问题,Java 序列化同样的问题。通用的有 google 的 Protocol Buffers 和 facebook 的 Thrift,有兴趣可以了解下,包括 gRPC。
版权声明: 本文为 InfoQ 作者【AIWeker】的原创文章。
原文链接:【http://xie.infoq.cn/article/9adab097ce15d0ae63f9897e2】。文章转载请联系作者。
评论