编程学习网 > 编程语言 > Python > Python 3.14 内置 zstd 压缩救了多少新手?
2026
08-03

Python 3.14 内置 zstd 压缩救了多少新手?


你有没有遇到过这种情况:写了个脚本要处理几万条日志,想压缩一下再发给同事,结果用 zip 压完还是好几百兆,微信直接提示"文件过大发不出去";又或者听说 zstd 压缩又快又好,兴冲冲去 pip install zstandard,装完发现版本不对,还得对着一堆英文文档调参数。

我前两天就踩了这么一坑。有个 1.2 G 的日志要发给运维兄弟,zip 压完还有 300 多兆。邮件附件上限 25 兆,微信文件 100 兆,怎么都发不出去。最后只能拆成好几份传,对方解压还要拼,两边都很烦。其实从 Python 3.14 开始,这些折腾可以省了。标准库直接把 Zstandard(江湖人称 zstd)收编了,不用装任何第三方库,一行 import 就能用,而且压缩率比 zip 常用的 deflate 高出一截。今天这篇文章,就带你把这个藏在标准库里的新功能彻底用明白。它不只是一味安利,更想帮你搞清楚它到底解决什么问题、什么时候该用。

以前压缩文件有多折腾

早几年,Python 自带的压缩就那么几样:gzipbz2lzmagzip 通用但压缩率一般;bz2 更省空间,代价是慢;lzma 压得最狠,慢得也更明显。想要 zstd 那种"又快又小"的体验,只能自己 pip install

而且 pip install zstandard 这种库,名字和实际模块名还不一样,导入的时候叫 zstandard,用的时候又是别的对象,新手经常 import 就报错。更别提有些公司内网没网、没权限,装都装不上,只能干瞪眼。

更要命的是打包。你想把一整个文件夹压成压缩包传出去,tarfilezipfile 以前都不认 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 包,里面把 lzmabz2gzipzlib 都收了进去,还顺手加了一个全新的 compression.zstd 模块。Zstandard Meta 开源的压缩算法,现在由 Python 官方维护、随版本一起发布,不用担心哪天第三方库不更新了。它最大的特点是:压缩率高、速度又快,尤其适合日志、数据库备份、模型权重这种"又大又重复"的数据。举个直观的例子:同样 1 G 的日志,gzip 压完可能还有 200 兆,zstd 往往只剩 120 兆左右,传起来快将近一倍。

为什么它能又快又小?简单说,zstd "压缩强度""速度"拆成了两个可以单独调的旋钮:压的时候你可以选从 1 22 的级别,级别越高越省空间但越慢;解的时候几乎不挑级别,一律飞快。所以它特别适合"一次压缩、反复解压"的场景,比如你压好日志传上去,别人下载解压看,体验非常顺。

具体点说,zstd 内部用了一种叫有限状态熵(FSE)的编码方式,再加上可以复用的"字典"机制:你经常压缩同类数据(比如同一种日志格式),可以先训练一个字典,后面压同类数据能再小一截。这个对日志、数据库备份特别有用。当然新手一开始不用管字典,默认的压缩级别就已经比 gzip 强了。你也不用深究底层原理,只要记住它把"压得慢但小""压得快但大"这两件事分开了,按需选级别就行。

用法简单到不像话,API bz2lzma 几乎一模一样:

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 的六到七成,而且压缩速度还更快。日志、JSONCSV 这种重复度高的文本,差距尤其明显。换句话说,同样的网络带宽,你能多发出将近一半的数据,或者把存储成本直接砍掉三成。

还有一点新手很容易忽略:解压速度。zstd 解压比 gzip 还快,这意味着你压完传上去,对方打开看几乎不用等待。对于要经常翻日志、读备份的场景,这点体验提升是实打实的。我自己的习惯是,本地任何大于几十兆的文本产物,统一用 zstd 压一遍再归档,几年下来省下的磁盘相当可观。

当然,zstd 也不是万能的。如果你要压的是图片、视频,或者已经压缩过的文件(jpgmp4png),它们本身就没多少可压缩的空间,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 tarfilezipfileshutil 全都认 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 一样直接读写文件

除了压缩内存里的 byteszstd 也提供了和 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教程欢迎持续关注编程学习网。 

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取