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 标准库中序列化速度最快、兼容性最广的模块,但只支持 strintfloatboolNonelistdict 这七种类型。遇到 datetimeset、自定义类实例时会直接抛出 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 为何又慢又重

PyYAMLsafe_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 参数,否则变成时间戳整数。

实操建议:

  • 安装时加 ujsonmsgpack 的 C 扩展:pip install msgpack --no-binary msgpack
  • 服务间通信、Redis 缓存、日志批量写入等场景,优先测 msgpack + use_bin_type=True
  • 不要依赖 msgpack.unpackb(data, raw=False) 自动转 bytesstr,Python 3 下易引发编码歧义

真正影响选型的往往不是“谁最快”,而是“谁在你的数据结构、部署环境、上下游约束下不出错”。比如用 msgpacknumpy.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多数据库连接配置