Python中的Msgpack:高效二进制序列化库

Python中的Msgpack:高效二进制序列化库

什么是 MessagePack?

MessagePack 是一种高效的二进制序列化格式。它类似于 JSON,但更小、更快。其设计目标是在保持易用性的同时,最小化数据体积并提升编码/解码速度。

  • ✅ 更小:相比 JSON,msgpack 通常能减少 50% 以上的数据大小。
  • ✅ 更快:二进制解析比文本解析更高效。
  • ✅ 跨语言支持:支持多种编程语言(Python、Java、Go、JavaScript 等),适合微服务间通信。

在 Python 中,我们通过 msgpack 第三方库来使用这一功能。


安装 msgpack

在使用前,需要先安装 msgpack 库:

pip install msgpack
注意:不要混淆 msgpack 和 msgpack-python(旧版本)。现在推荐直接使用 msgpack

基本用法

1. 序列化(打包)

使用 msgpack.packb() 将 Python 对象序列化为二进制数据:

import msgpack data = { "name": "Alice", "age": 30, "is_student": False, "courses": ["Math", "CS"], "scores": {"math": 95, "cs": 98} } # 序列化为二进制 packed_data = msgpack.packb(data) print(packed_data) # 输出: b'\x85\xa4name\xa5Alice\xa3age\x1e\xaais_student\xc2...'

2. 反序列化(解包)

使用 msgpack.unpackb() 将二进制数据还原为 Python 对象:

unpacked_data = msgpack.unpackb(packed_data, raw=False) print(unpacked_data) # 输出: {'name': 'Alice', 'age': 30, 'is_student': False, ...}
⚠️ 注意:raw=False 表示将字符串解码为 Python str 类型(默认为 bytes)。

支持的数据类型

Msgpack 支持常见的 Python 数据类型:

Python 类型Msgpack 类型
int整数(变长编码)
float浮点数
str / bytes字符串 / 二进制数据
list数组
dict映射(键必须为 str)
True / False布尔值
Nonenil
❗ 注意:字典的键必须是字符串(不能是整数或其他类型),否则会报错。

与 JSON 的对比

特性JSONMsgpack
格式文本(UTF-8)二进制
数据大小较大更小(通常节省 30%-70%)
编解码速度较慢更快
可读性高(人类可读)低(需工具查看)
跨语言支持广泛广泛
支持 NaN/Inf是(可选)
默认精度双精度浮点保留原始 float 类型

示例对比

import json import msgpack data = {"value": 3.1415926, "tags": ["a", "b", "c"] * 100} # JSON 序列化 json_data = json.dumps(data).encode('utf-8') print("JSON size:", len(json_data)) # e.g., 780 bytes # Msgpack 序列化 msgpack_data = msgpack.packb(data) print("Msgpack size:", len(msgpack_data)) # e.g., 420 bytes

可见,在数据量较大时,msgpack 明显更节省空间。


高级特性

1. 自定义对象编码

msgpack 允许你注册自定义类型的编码/解码器。例如,序列化 datetime 对象:

import msgpack from datetime import datetime def default(obj): if isinstance(obj, datetime): return {'__datetime__': True, 'value': obj.isoformat()} raise TypeError(f"Unknown type: {type(obj)}") def object_hook(obj): if '__datetime__' in obj: return datetime.fromisoformat(obj['value']) return obj # 使用 now = datetime.now() packed = msgpack.packb(now, default=default) unpacked = msgpack.unpackb(packed, object_hook=object_hook, raw=False) print(unpacked) # 恢复为 datetime 对象

2. 流式处理大文件

对于大型数据,可以使用文件流方式避免内存溢出:

# 写入多个对象到文件 with open('data.mp', 'wb') as f: for i in range(1000): msgpack.pack({"id": i, "data": f"item_{i}"}, f) # 逐个读取 with open('data.mp', 'rb') as f: while True: try: item = msgpack.unpack(f) print(item) except msgpack.OutOfData: break

实际应用场景

  1. 微服务通信
    在 gRPC 或 REST API 中,使用 msgpack 替代 JSON 可显著降低带宽消耗和响应时间。
  2. 缓存系统
    Redis、Memcached 中存储复杂对象时,msgpack 比 pickle 更安全,比 JSON 更紧凑。
  3. 日志系统
    高频日志写入场景下,使用 msgpack 可减少磁盘 I/O 和存储成本。
  4. 游戏服务器
    实时同步玩家状态、位置等信息,要求低延迟和高吞吐,msgpack 是理想选择。

性能建议

  • ✅ 使用 use_bin_type=True(默认)以获得最佳兼容性。
  • ✅ 对于大量小对象,考虑批量打包以减少调用开销。
  • ✅ 避免频繁序列化/反序列化,合理使用缓存。

总结

msgpack 是一个轻量、高效、跨语言的二进制序列化库,特别适合对性能和带宽敏感的应用场景。在 Python 中,它提供了简洁的 API 和良好的扩展性,是 json 和 pickle 的优秀替代方案之一。

虽然它牺牲了人类可读性,但在大多数机器间通信场景中,这种代价是值得的。如果你正在构建高性能系统,不妨尝试将 msgpack 引入你的技术栈。


参考资料

🚀 提示:结合 zstd 或 lz4 压缩算法,可进一步压缩 msgpack 数据,实现极致的存储与传输效率。

Read more

Python金融数据获取终极指南:告别繁琐,5分钟掌握专业级数据源

Python金融数据获取终极指南:告别繁琐,5分钟掌握专业级数据源 【免费下载链接】mootdx通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 还在为金融数据获取而苦恼吗?面对复杂的行情接口、繁琐的数据格式转换,很多数据分析师和量化交易爱好者都感到力不从心。今天,我将为你揭秘一个强大的Python工具——mootdx,它能让你轻松获取通达信金融数据,为你的投资分析提供坚实的数据支撑。 🎯 你的数据获取痛点,我们懂! 数据获取的三大难题: * 接口复杂难上手:传统行情接口学习成本高,文档晦涩 * 数据格式不统一:不同来源的数据格式各异,转换工作繁琐 * 更新维护成本高:数据源不稳定,需要频繁调整和维护 mootdx正是为解决这些痛点而生,它提供了: * 📊 一站式数据解决方案:从历史数据到实时行情,全面覆盖 * 🔄 智能连接优化:自动选择最佳服务器,确保数据稳定获取 * 💡 开发体验升级:简洁的API设计,让数据获取变得简单高效 🚀 快速上手:5分钟开启数据

By Ne0inhk
Python Anaconda 换源: 设置清华源

Python Anaconda 换源: 设置清华源

为 Anaconda 设置清华源可以极大地提升软件包下载和更新的速度。以下是详细的步骤,分为两个主要部分:为 conda 本身设置频道镜像和为 pip 设置索引镜像。 方法一:通过命令行快速设置(推荐) 这是最快捷的方法,通过执行几条命令即可完成。 1. 打开终端(Windows 用 Anaconda Prompt, Mac/Linux 用 Terminal)。 验证配置: 执行以下命令查看当前的配置,确认 channels 里已经都是清华源的地址。 conda config --show channels (可选但推荐)移除默认的官方频道: 为了避免 conda 在官方源和清华源之间来回切换,可以移除默认的 defaults 频道。 conda config --remove channels defaults 设置搜索时显示频道地址: conda config

By Ne0inhk

Python 进阶爬虫:解析知识星球 API

一、知识星球 API 核心原理与接口分析 知识星球的前端页面采用动态加载技术(JavaScript 渲染),所有内容数据均通过后端 API 接口以 JSON 格式返回,前端再将数据渲染为可视化页面。因此,API 爬虫的核心逻辑是模拟前端请求,直接调用 API 接口获取原始 JSON 数据,而非解析 HTML 页面。 1.1 API 接口基础架构 知识星球的 API 接口遵循 RESTful 设计规范,核心请求域名为<font>https://api.zsxq.com</font>,所有接口均通过 HTTPS 协议传输,确保数据安全性。接口主要分为三大类: * 认证类接口:

By Ne0inhk
Python核心:Django鉴权方案全解析

Python核心:Django鉴权方案全解析

让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再@新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15045666310 🌐网站:https://meihua150.cn/ 💡座右铭:坚持自己的坚持,不要迷失自己!要快乐 目录 * 让我们一起走向未来 * 1. Django认证系统概述 * 2. 用户身份验证(Authentication) * 用户模型 * 用户登录验证 * 用户注销 * 3. 用户权限控制(Authorization) * 权限 * 用户组 * 权限检查 * 装饰器:`@login_required` 和 `@permission_required` * 4. 自定义认证系统 * 自定义用户模型 * 基于Token的认证(例如JWT)

By Ne0inhk