Python msgpack 的压缩与速度权衡

千敏姑娘_7186

千敏姑娘_7186

2026-02-21

245人浏览

原创

use_bin_type和default不影响压缩率,因压缩率仅取决于序列化后字节流长度;use_bin_type仅控制字符串编码类型,default仅处理不可序列化对象的回退逻辑。

python msgpack 的压缩与速度权衡

msgpack.packb() 里用 use_bin_type 和 default 会影响压缩率吗

不影响。压缩率只由底层序列化后的字节流长度决定,而 use_bin_type 只控制字符串是否用 BIN 类型(而非 STR),default 只影响无法直序列化的对象如何 fallback——它们不改变原始数据的语义体积。真正影响压缩率的是你传进去的数据结构本身,比如嵌套深度、重复 key、长字符串是否被 dedup(msgpack 不做 dedup)。

实操建议:

  • use_bin_type=True 是 Python 3 下推荐值,否则 bytes 被当 str 处理,反序列化时类型丢失
  • default 函数若返回大对象(比如把 datetime 转成含冗余字段的 dict),反而会增大体积
  • 想压得更小?先用 orjson 或 ujson 预处理成紧凑 JSON 字符串,再 pack 成 bytes——但这就绕开 msgpack 的二进制优势了

启用 zlib 压缩后,msgpack.unpackb() 必须配对解压吗

必须。msgpack 本身不带压缩逻辑,zlib.compress() 包出来的是一段普通字节流,msgpack 完全感知不到它曾被压缩。如果你直接把 zlib 压缩后的 bytes 丢给 msgpack.unpackb(),会报 ExtraData 或 InvalidString 错误——因为开头几个字节是 zlib header,不是 msgpack magic。

正确做法是手动分层:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 打包:先 msgpack.packb(data) → 得到 raw bytes,再 zlib.compress(raw_bytes)
  • 解包:先 zlib.decompress(compressed_bytes) → 得到 raw bytes,再 msgpack.unpackb(raw_bytes)
  • 别用 msgpack.packb(..., use_bin_type=True) + zlib 后直接存——看起来省事,但读取时没人告诉你这坨 bytes 还要先 zlib 解压

为什么开了 use_single_float=True 反而变慢还更大

因为单精度浮点(float32)在 Python 里要额外转换:Python float 是 float64,msgpack 得先截断再编码;而 float64 编码是原生支持的,更快也更稳。实测多数场景下 use_single_float=True 既不省空间(IEEE754 单精度只省 4 字节/数,但可能因对齐反而膨胀),又触发额外类型检查和转换开销。

适用场景极少:

  • 你确定所有 float 都来自 numpy 的 float32 数组,且传输端也是 C/C++ 侧直接读 float32
  • 数据里 float 占比极高(>70%),且值域确实能被 float32 精确表示(比如传感器采样值)
  • 网络带宽极端受限,且你已用 zlib 压过一遍,发现 float64 的冗余模式没被压干净——这时候才值得试

msgpack 在 PyPy 下比 CPython 快,但压缩后反而慢了

PyPy 的 JIT 对纯 Python 的 msgpack 序列化加速明显,但一旦加了 zlib.compress(),就掉回 C 扩展瓶颈——zlib 是 C 实现,PyPy 的 CFFI 调用开销比 CPython 的 ctypes 稍高,尤其小数据块(

调优要点:

  • 不要对每个小 dict 单独 compress + pack;攒一批(比如 10–100 条)再压,摊薄 zlib 初始化成本
  • PyPy 下优先用 lz4 替代 zlib:安装 lz4 后,用 lz4.frame.compress(msgpack.packb(data)),速度通常快 2–3 倍,压缩率略低但够用
  • 如果数据本身很稀疏(比如大量 None/空 list),先用 msgpack.packb(data, strict_types=True) 避免自动类型推导拖慢 PyPy 的 trace 记录

事情说清了就结束

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3602

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4139

7

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

2024.04.28

7207

8

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

2025.10.23

844

4

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1858

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2964

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6264

49

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程