
你有没有遇到过这种情况:写了个脚本要处理几万条日志,想压缩一下再发给同事,结果用 zip 压完还是好几百兆,微信直接提示"文件过大发不出去";又或者听说 zstd 压缩又快又好,兴冲冲去 pip install zstandard,装完发现版本不对,还得对着一堆英文文档调参数。
我前两天就踩了这么一坑。有个 1.2 G 的日志要发给运维兄弟,zip 压完还有 300 多兆。邮件附件上限 25 兆,微信文件 100 兆,怎么都发不出去。最后只能拆成好几份传,对方解压还要拼,两边都很烦。其实从 Python 3.14 开始,这些折腾可以省了。标准库直接把 Zstandard(江湖人称 zstd)收编了,不用装任何第三方库,一行 import 就能用,而且压缩率比 zip 常用的 deflate 高出一截。今天这篇文章,就带你把这个藏在标准库里的新功能彻底用明白。它不只是一味安利,更想帮你搞清楚它到底解决什么问题、什么时候该用。
以前压缩文件有多折腾
早几年,Python 自带的压缩就那么几样:gzip、bz2、lzma。gzip 通用但压缩率一般;bz2 更省空间,代价是慢;lzma 压得最狠,慢得也更明显。想要 zstd 那种"又快又小"的体验,只能自己 pip install。
而且 pip install zstandard 这种库,名字和实际模块名还不一样,导入的时候叫 zstandard,用的时候又是别的对象,新手经常 import 就报错。更别提有些公司内网没网、没权限,装都装不上,只能干瞪眼。
更要命的是打包。你想把一整个文件夹压成压缩包传出去,tarfile、zipfile 以前都不认 zstd,要么退回 gzip,要么装第三方 backport。新手光是配环境就能被劝退,好不容易装上了,换个机器又得重来一遍。
用 gzip 压一段文本的写法大概是这样:
import gzip
data = b"Python 3.14 zstd rocks! " * 1000
with gzip.open("demo.gz", "wb") as f:
f.write(data)
Python 3.14 直接把 zstd 塞进标准库了
Python 3.14 新增了一个 compression 包,里面把 lzma、bz2、gzip、zlib 都收了进去,还顺手加了一个全新的 compression.zstd 模块。Zstandard 是 Meta 开源的压缩算法,现在由 Python 官方维护、随版本一起发布,不用担心哪天第三方库不更新了。它最大的特点是:压缩率高、速度又快,尤其适合日志、数据库备份、模型权重这种"又大又重复"的数据。举个直观的例子:同样 1 G 的日志,gzip 压完可能还有 200 兆,zstd 往往只剩 120 兆左右,传起来快将近一倍。
为什么它能又快又小?简单说,zstd 把"压缩强度"和"速度"拆成了两个可以单独调的旋钮:压的时候你可以选从 1 到 22 的级别,级别越高越省空间但越慢;解的时候几乎不挑级别,一律飞快。所以它特别适合"一次压缩、反复解压"的场景,比如你压好日志传上去,别人下载解压看,体验非常顺。
具体点说,zstd 内部用了一种叫有限状态熵(FSE)的编码方式,再加上可以复用的"字典"机制:你经常压缩同类数据(比如同一种日志格式),可以先训练一个字典,后面压同类数据能再小一截。这个对日志、数据库备份特别有用。当然新手一开始不用管字典,默认的压缩级别就已经比 gzip 强了。你也不用深究底层原理,只要记住它把"压得慢但小"和"压得快但大"这两件事分开了,按需选级别就行。
用法简单到不像话,API 跟 bz2、lzma 几乎一模一样:
from compression import zstd
data = b"Python 3.14 zstd rocks! " * 1000
compressed = zstd.compress(data)
print(len(compressed), len(data)) # 压缩后小很多
back = zstd.decompress(compressed)
print(back == data) # True
你看,compress 进去,decompress 回来,数据原样还原。整个过程零依赖,Python 3.14 装好就能直接跑。
压缩率到底强在哪:和 gzip 掰手腕
光说快没用,上数据。同样一段重复的日志文本,分别用 gzip 和 zstd 压一下:
import gzip, os
from compression import zstd
sample = ("日志内容 " * 200).encode("utf-8")
g = gzip.compress(sample)
z = zstd.compress(sample)
print("原始", len(sample))
print("gzip", len(g))
print("zstd", len(z))
实际跑下来,zstd 压出来的体积通常只有 gzip 的六到七成,而且压缩速度还更快。日志、JSON、CSV 这种重复度高的文本,差距尤其明显。换句话说,同样的网络带宽,你能多发出将近一半的数据,或者把存储成本直接砍掉三成。
还有一点新手很容易忽略:解压速度。zstd 解压比 gzip 还快,这意味着你压完传上去,对方打开看几乎不用等待。对于要经常翻日志、读备份的场景,这点体验提升是实打实的。我自己的习惯是,本地任何大于几十兆的文本产物,统一用 zstd 压一遍再归档,几年下来省下的磁盘相当可观。
当然,zstd 也不是万能的。如果你要压的是图片、视频,或者已经压缩过的文件(jpg、mp4、png),它们本身就没多少可压缩的空间,zstd 和 gzip 都压不出多少,这时候选谁差别不大,甚至 gzip 更通用。zstd 真正的优势场景,是"文本类、重复度高、体积大"的数据。
想压得更小?调一下级别就行
compress 的第二个参数就是压缩级别,从 1 到 22。级别越高体积越小,但压得越慢:
from compression import zstd
data = b"repeat " * 5000
fast = zstd.compress(data, 1)
best = zstd.compress(data, 22)
print(len(fast), len(best))
默认级别已经很均衡,新手不用特意调。只是记住一条铁律:级别只影响"压"的速度和体积,"解"的时候都一样快。所以如果你这份数据要被反复解压很多次,舍得在压的时候多花点时间,是非常划算的。比如实时压缩网络传输的数据,用级别 1 几乎不掉速度;而像年度归档这种压一次放十年的,用 22 最划算。
还能直接打包成 .tar.zst / .zip.zst
光压缩一段 bytes 还不够爽。Python 3.14 让 tarfile、zipfile、shutil 全都认 zstd 了,你可以直接打压缩包,不用再绕弯。
打包成 tar.zst:
import tarfile
with tarfile.open("data.tar.zst", "w:zst") as tf:
tf.add("report.txt")
打 zip 的时候指定压缩方式:
import zipfile
with zipfile.ZipFile("data.zip", "w") as zf:
zf.writestr("hello.txt", "Hi!", zipfile.ZIP_ZSTANDARD)
反过来解包也不用操心,shutil.unpack_archive("data.tar.zst") 一行就能拆。以前这些活儿要么装第三方库,要么退回 gzip,现在标准库一口气全包了。
还能像 open 一样直接读写文件
除了压缩内存里的 bytes,zstd 也提供了和 gzip.open 一样的上下文管理器,直接读写 .zst 文件,不用自己先 compress 再写盘:
from compression import zstd
with zstd.open("big.txt.zst", "wb") as f:
f.write(b"hello zstd stream")
with zstd.open("big.txt.zst", "rb") as f:
print(f.read())
写的时候用 "wb",读的时候用 "rb",和普通的文件操作几乎没有区别。处理大文件时,这种流式读写比"先读全量再压缩"省内存得多。如果你要压的是几个 G 的大日志,这种写法能边读边压,内存占用几乎不会涨。
新手要注意的 2 个小坑
第一,这个功能是 Python 3.14 才有的,老版本(3.13 及以前)没有 compression 包,跑这段代码会直接报 ModuleNotFoundError。本地版本不确定,就敲一行 python --version 看看。
第二,导入名用的是新的 compression.zstd,不是老牌的 zstandard 第三方库。两者 API 很像,但别混了——第三方库要 pip install,标准库这个白送。如果你的代码要兼容老版本,可以用 try / except 兜底:优先用标准库,没有就退回到第三方包。
到底什么时候用 zstd,什么时候用 zip
最后给个实在的建议。如果你压完是要发给别人、或者做一个给别人用的工具,zip 还是最稳的,因为几乎每台电脑、每个系统都认 zip,对方不用装任何东西。但如果是你自己处理日志、做备份、传大文件,zstd 在体积和速度上都更香。一句话总结:对外用 zip 保兼容,对内用 zstd 提效率。举个实际例子:你用 CI 跑完测试,产生一堆日志和产物,用 zstd 压完再传去存档,既省带宽又省存储;而你要给别人发个安装包,还是打成 zip 最省心。事实上,像 Meta、很多游戏公司,甚至 Linux 内核的源码分发,背后都已经用上 zstd 了。
压缩这种看着不起眼的小功能,往往最影响日常体验。你平时处理大文件、传日志,是用 zip 凑合,还是早就用上 zstd 了?有没有被"文件过大发不出去"坑过的经历?评论区聊聊,说不定能帮到同样卡在环境配置上的新手。
以上就是“Python 3.14 内置 zstd 压缩救了多少新手?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14379/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料