Python 序列化指南
Apache Fory™ 是一个极速的多语言序列化框架,基于 JIT 编译和零拷贝技术,在保持易用性和安全性的同时提供超高性能。
pyfory 提供 Apache Fory™ 的 Python 实现,为数据处理任务提供高性能对象序列化和先进的行格式能力。
核心特性
灵活的序列化模式
- Python 原生模式:完全 Python 兼容,可替代 pickle/cloudpickle
- 跨语言模式:针对多语言数据交换优化
- 行格式:用于分析工作负载的零拷贝行格式
多功能序列化特性
- 共享/循环引用支持:在 Python 原生和跨语言模式中支持复杂对象图
- 多态支持:自定义类型的自动类型分发
- Schema 演化支持:在跨语言模式下使用 dataclass 时的向后/向前兼容性
- 带外缓冲区支持:零拷贝序列化大型数据结构(如 NumPy 数组和 Pandas DataFrame),兼容 pickle 协议 5
极速性能
- 超快性能:相比其他序列化框架
- 运行时代码生成和 Cython 加速的核心实现,实现最优性能
紧凑数据大小
- 紧凑的对象图协议:最小空间开销——相比 pickle/cloudpickle 减少高达 3 倍大小
- 元数据打包与共享:最小化类型向前/向后兼容性的空间开销
安全性与安全
- 严格模式:通过类型注册和检查防止反序列化不受信任的类型
- 引用跟踪:安全处理循环引用
安装
基础安装
pip install pyfory
可选依赖
# 安装行格式支持(需要 Apache Arrow)
pip install pyfory[format]
# 从源码安装用于开发
git clone https://github.com/apache/fory.git
cd fory/python
pip install -e ".[dev,format]"
系统要求
- Python:3.8 或更高版本
- 操作系统:Linux、macOS、Windows
线程安全
pyfory 提供 ThreadSafeFory 用于线程安全序列化,使用线程本地存储:
import pyfory
import threading
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
# 创建线程安全的 Fory 实例
fory = pyfory.ThreadSafeFory(xlang=False, ref=True)
fory.register(Person)
# 在多线程中安全使用
def serialize_in_thread(thread_id):
person = Person(name=f"User{thread_id}", age=25 + thread_id)
data = fory.serialize(person)
result = fory.deserialize(data)
print(f"Thread {thread_id}: {result}")
threads = [threading.Thread(target=serialize_in_thread, args=(i,)) for i in range(10)]
for t in threads: t.start()
for t in threads: t.join()
核心特性:
- 实例池:维护一个受锁保护的
Fory实例池,确保线程安全 - 共享配置:所有注册必须预先完成,并应用于所有实例
- 相同 API:与
Fory类相同的方法,可直接替换 - 注册安全:防止首次使用后注册,确保一致性
适用场景:
- 多线程应用程序:Web 服务器、并发工作线程、并行处理
- 共享 Fory 实例:当多个线程需要序列化/反序列化数据时
- 线程池:使用线程池或 concurrent.futures 的应用程序
快速开始
import pyfory
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
# 创建 Fory 实例
fory = pyfory.Fory(xlang=False, ref=True)
fory.register(Person)
person = Person("Alice", 30)
data = fory.serialize(person)
result = fory.deserialize(data)
print(result) # Person(name='Alice', age=30)