Python使用pickle高效存储与读取大型列表和字典数据

林见深
林见深
发布时间:2026-10-13| 3人浏览过
原创

本文介绍利用Python pickle模块存储和读取大型列表及字典数据的方法。重点解析pickle协议参数protocol的作用,推荐使用pickle.HIGHEST_PROTOCOL以提升序列化速度、减少文件体积并支持超大对象,从而优化大数据持久化存储效率。

Python pickle存储与读取大数据方案

本节主要介绍如何在Python中使用pickle模块来存储和读取数据量较大的列表与字典对象。

面对数据规模庞大的列表或字典,将其序列化为数据包进行调用是一种有效策略,能够显著减小文件体积并提升调用效率。


#列表
  #存储
  list1 = [123,'xiaopingguo',54,[90,78]]
  list_file = open('list1.pickle','wb')
  pickle.dump(list1,list_file)
  list_file.close()
 
  #读取
  list_file = open('list1.pickle','rb')
  list2 = pickle.load(list_file)
  print(list2)
 
#字典
  #存储
  list3 = {'12': 123, '23': 'xiaopingguo', '34': 54, '45': [90, 78]}
  list3_file = open('list3.pickle', 'wb')
  pickle.dump(list3, list3_file)
  list3_file.close()
  # # 读取
  list3_file = open('list3.pickle', 'rb')
  list3 = pickle.load(list3_file)
  print(list3)

  print(list3['23']

接下来,我们将通过具体示例展示如何利用pickle处理大规模数据。

在处理某项数据任务时,遇到一个体积巨大的字典型中间变量。由于该变量需要在后续工作中被持久化且高频访问,因此考虑将其保存为类似Matlab .mat格式的数据文件,以便随时快速读取。

自然想到的方案是使用pickle保存数据,因为这是Python环境中最常用且最简单的数据存储方式。Python存储数据的方法多样,除了pickle,还可以选择JSON、TXT等格式。至于其他如pandas、H5等方式,此处暂不展开讨论。

(注:pandas、H5等其他存储方式此处略过。)

pickle模块原理与局限性

关于pickle模块的基本介绍。

pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。其中,序列化(pickling)是将Python对象层次结构转换为字节流的过程;反序列化(unpickling)则是将字节流还原为对象层次结构的过程。

需要注意的是,pickle是Python特有的机制,非Python程序通常无法直接重构pickle对象。在实际工作中,我曾遇到一个案例:使用sklearn训练得到的机器学习模型通过pickle保存后,工程部门的同事无法直接用Java调用该模型。当时有一位同事通过阅读pickle源码,手动用Java一步步实现了反序列化,这种做法令人佩服。

优化大数据序列化的关键技巧

以下是pickle使用的关键技巧。

对于简单的代码场景,直接使用dump()和load()函数即可满足需求。


import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
  pickle.dump(data, f)
# 读取
with open('data.pickle', 'rb') as f:
  b = pickle.load(f)

然而,如果查阅pickle的官方文档,会发现存在一个名为protocol的参数。该参数代表序列化协议(pickle协议),在Python 2.x版本中默认值为0,而在Python 3.x版本中默认值为3。简而言之,不同的Python版本对应不同的最高协议支持,且protocol值越大,代表的协议版本越高。具体对应关系如图所示。

修改protocol参数会产生什么影响?通常情况下,protocol值越大,dump操作的速度越快,支持的数据类型也更多,保存下来的文件占用的磁盘空间更小。此外,它还带来其他优化,例如在Python 3.4中,协议版本4新增了对超大数据对象序列化的支持。因此,在条件允许的情况下,建议将protocol参数设置为最高协议版本,即指定protocol=pickle.HIGHEST_PROTOCOL。

基于上述技巧,前面的示例代码可以优化为以下形式:


import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
  pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
# 读取
with open('data.pickle', 'rb') as f:
  b = pickle.load(f)

对于小规模数据,这种差异可能并不明显。

但在处理大规模数据序列化时,请务必注意pickle的这一优化技巧。

总结。

以上内容详细介绍了Python中利用pickle存储和读取大数据量列表及字典的方法。本文提供的方案详细且实用,具有一定的参考借鉴价值,需要的朋友可以参考使用。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。