pickle有坑

序列化Python对象——pickle模块的基本使用

用途

如: 机器学习 比如说要构建机器学习模型的时候,就说决策树吧,一般情况下决策树模型都是先建树,然后剪枝,然后做预测,但这样有个不好的地方就是,明明是同一棵树上跑测试数据,但是每次都要重新建一次树,而决策树的大部分时间就浪费在建树了,所以我可以在第一次完整跑的时候用pickle把整个树保存起来,以后再跑测试的时候直接load进来预测或剪枝就好了,这样做节省了大量的时间。

如:
谢邀。
很多入门教程里讲解序列化一般是这个流程:

对象1 -- 序列化 -> 字节串 -- 反序列化 -> 对象2

所以很多人并不知道为什么要序列化。

估计很多人都有耳闻 Python 在处理计算密集型的任务时性能不好,一般不能充分使用多核 CPU 的优势,这时候会使用多进程来优化。
有一种多进程的计算方式是这样的,进程分为 master 和 worker,master 负责调度任务,worker 则专于计算,比如 Celery 这个库。
那么问题来了,master 中产生了一个任务需要交给 worker 来计算,因为进程之间内存是隔离的,worker 不能直接访问到这个任务对象。
所以 master 需要以某种方式将这个对象表示出来传递给 worker,而且 worker 能够根据这个表示方式来构造出这个对象(的替身),这个过程就是序列化和反序列化。
而 pickle 是 Python 内部的一种序列化方式,对 Python 对象有很好的支持,而这个原因也正是 Celery 默认使用 pickle 的原因,Is Celery dependent on pickle?
从序列化的角度来看,pickle 的方案和 JSON,YAML,XML 等没有本质的区别。
不过 pickle 的安全性不足,永远不要反序列化不可信来源的 pickle 字节串,因此 pickle 方案不适合用于网络通信。

posted @ 2019-08-16 15:55  张明岩  阅读(676)  评论(0)    收藏  举报