python中常用的序列化模块_json、pickle、yaml、msgpack性能对比
发布时间 - 2026-02-02 00:00:00 点击率:次json快但功能受限,仅支持str、int、float、bool、None、list、dict七种类型,遇datetime等会抛TypeError;实操中可用default参数转ISO字符串,避免深拷贝。
json.dumps/json.loads 为什么快但功能受限
json 是 Python 标准库中序列化速度最快、兼容性最广的模块,但只支持 str、int、float、bool、None、list、dict 这七种类型。遇到 datetime、set、自定义类实例时会直接抛出 TypeError: Object of type ... is not JSON serializable。
实操建议:
- 用
default参数配合isinstance手动转datetime为 ISO 字符串(注意时区) - 避免在
default中做深拷贝或递归处理,否则性能断崖下跌 - 生产环境高频小数据(如 API 响应)优先选
json,别为了“看起来高级”换其
他模块
pickle.dumps/pickle.loads 的安全与兼容陷阱
pickle 能序列化几乎所有 Python 对象,包括函数、类实例、闭包,但它是 Python 特有协议,跨语言不可读;更关键的是,pickle.loads() 可执行任意代码 —— 任何来自不可信源的 pickle 数据都等同于远程代码执行漏洞。
实操建议:
- 永远不在网络传输、用户上传、日志回放等场景用
pickle - 若必须本地持久化(如缓存中间计算结果),限定使用
protocol=4(Python 3.4+ 默认),它比protocol=3小 10–20%,且支持更多内置类型 -
__reduce__方法可被恶意利用,自定义类若需支持pickle,务必检查其返回值是否可控
yaml.safe_dump/yaml.safe_load 为何又慢又重
PyYAML 的 safe_load 看似安全,但实际解析器仍存在历史 CVE(如 CVE-2017-18342),且默认启用复杂解析逻辑(锚点、标签、自动类型推断),导致性能远低于 json。一个 100KB 的纯字典数据,yaml.safe_load 可能比 json.loads 慢 5–8 倍。
实操建议:
- 除非明确需要 YAML 特性(如注释、多文档、锚引用),否则别用
yaml做通用序列化 - 禁用自动类型转换:传入
Loader=yaml.CLoader(需编译安装libyaml)和yaml.load(..., Loader=yaml.CSafeLoader) -
配置文件用
yaml,运行时数据交换别碰它
msgpack.packb/msgpack.unpackb 的二进制优势与隐含成本
msgpack 是唯一在性能、体积、跨语言支持上全面优于 json 的选择:相同数据通常小 30–50%,序列化/反序列化快 2–4 倍。但它默认不保留 key 顺序(Python 3.7+ dict 有序,但 msgpack 不保证),且 datetime 需显式开启 datetime=True 参数,否则变成时间戳整数。
实操建议:
- 安装时加
ujson和msgpack的 C 扩展:pip install msgpack --no-binary msgpack - 服务间通信、Redis 缓存、日志批量写入等场景,优先测
msgpack+use_bin_type=True - 不要依赖
msgpack.unpackb(data, raw=False)自动转bytes为str,Python 3 下易引发编码歧义
真正影响选型的往往不是“谁最快”,而是“谁在你的数据结构、部署环境、上下游约束下不出错”。比如用 msgpack 存 numpy.ndarray,得额外配 ext_hook;而 json 明知慢,却因浏览器直读、CDN 缓存友好,成了事实标准。选模块前,先跑一遍你的真实数据样本,用 timeit 测三轮,比看任何 benchmark 都管用。
# python
# redis
# js
# json
# 编码
# 浏览器
# cdn
# 配置文件
# 标准库
# yy
# 为什么
# red
# numpy
# pip
# Float
# Object
# 字符串
# 递归
# bool
# int
# 数据结构
# 闭包
# 类型转换
# 对象
# default
# 序列化
# 自定义
# 的是
# 成了
# 它是
# 一遍
# 但它
# 几乎所有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
音响网站制作视频教程,隆霸音响官方网站?
如何在阿里云通过域名搭建网站?
Bootstrap整体框架之CSS12栅格系统
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel如何处理异常和错误?(Handler示例)
如何在Tomcat中配置并部署网站项目?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
无锡营销型网站制作公司,无锡网选车牌流程?
如何用美橙互联一键搭建多站合一网站?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何获取PHP WAP自助建站系统源码?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
独立制作一个网站多少钱,建立网站需要花多少钱?
微信小程序 canvas开发实例及注意事项
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何在景安服务器上快速搭建个人网站?
利用python获取某年中每个月的第一天和最后一天
Laravel如何发送系统通知?(Notification渠道示例)
js实现获取鼠标当前的位置
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel怎么实现验证码(Captcha)功能
java ZXing生成二维码及条码实例分享
文字头像制作网站推荐软件,醒图能自动配文字吗?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
如何用花生壳三步快速搭建专属网站?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
手机软键盘弹出时影响布局的解决方法
Laravel如何使用Livewire构建动态组件?(入门代码)
高端网站建设与定制开发一站式解决方案 中企动力
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Thinkphp 中 distinct 的用法解析
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Android仿QQ列表左滑删除操作
如何在建站之星绑定自定义域名?
如何在云主机上快速搭建多站点网站?
Laravel怎么连接多个数据库_Laravel多数据库连接配置


