点击上方“潜心的Python小屋”关注我们,第一时间推送优质文章。
前言
大家好,我是潜心。最近在复现2018年阿里提出的CTR预估模型---DIN,关于原生数据的处理以及数据集的构建,因为数据量过于庞大,开源代码使用了Pickle模块。后来查阅相关资料了解后,发现原来是Python标准库中用于数据序列化的模块。在此进行总结记录。
本文约2.5k字,预计阅读10分钟。
Pickle模块---对象序列化
序列化
序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。Python编程核心的序列化机制是pickle
标准库。
Pickle---Python序列化
模块 pickle
实现了对一个 Python 对象结构的二进制序列化和反序列化。 "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 "unpickling" 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。pickling(和 unpickling)也被称为序列化
(和反序列化
)。
注:pickle
模块并不安全。只应该对信任的数据进行unpickle操作。构建恶意的 pickle 数据来在解封时执行任意代码是可能的。绝对不要对不信任来源的数据和可能被篡改过的数据进行解封。在处理不信任数据时,更安全的序列化格式如 json
更为适合。
Pickle序列化的功能与好处
pickle的功能就是把你上次计算得到的数据保存起来,当你需要使用这些数据时,直接通过load
将数据进行恢复,这样的好处有:
不需要重新去计算得到数据,节省计算机资源;
可以更好的被内存调用,不需要经过数据格式的转换,提高效率;【直接保存为其他格式,如txt、csv的数据读写速度都不如序列化后的数据(字节流)】
pickle可以保存多个对象。实验中,同一数据集下需要保存的内容不止一种,通过pickle可以全部进行保存到一个
.pkl
文件。
Pickle与JSON的比较
Pickle 协议和 JSON (JavaScript Object Notation) 间有着本质的不同:
JSON 是一个文本序列化格式(它输出 unicode 文本),而 pickle 是一个二进制序列化格式;
JSON 是可以阅读的(
.json
文件可以直接打开),而 pickle 不能(.pickle
文件);JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Pytho