Python中如何实现兼顾速度与压缩率的文件压缩归档?
兼顾压缩速度与压缩率的Python压缩方案
针对你当前用shutil.make_archive处理ZIP压缩速度慢、无法支持大文件的问题,以下是直接可用的优化方案:
一、先解决ZIP本身的速度瓶颈
shutil.make_archive的ZIP实现是单线程的,且默认压缩级别偏保守,这是速度慢的核心原因。直接换用支持多线程的工具或库,即使继续用ZIP格式也能大幅提速:
用7-Zip命令行调用ZIP(推荐,速度最快)
7-Zip对ZIP格式的多线程支持非常成熟,平衡模式下速度是shutil的3-5倍,压缩率也更好:
import subprocess def zip_with_7zip(source_dir, output_zip): # -mx3:平衡压缩率与速度;-mmt=on:启用多线程(自动用全部CPU核心) subprocess.run( ["7z", "a", "-tzip", "-mx3", "-mmt=on", output_zip, source_dir], check=True, stdout=subprocess.DEVNULL, # 屏蔽输出,UI应用更友好 stderr=subprocess.DEVNULL )
二、更优的压缩格式选择(兼顾速度与压缩率)
如果可以更换格式,以下两个选项比ZIP更适合你的需求:
1. 7Z格式(LZMA2算法)
7Z的LZMA2天生支持多线程,平衡模式(预设3)下,压缩率比ZIP高10%-20%,速度和ZIP平衡模式相当;最快模式(预设1)下速度接近文件复制,压缩率仍优于ZIP最快模式。用py7zr库可以纯Python调用,无需依赖7-Zip命令行:
import py7zr def compress_7z(source_dir, output_7z): # preset=3:平衡模式;threads=-1:用全部CPU核心 with py7zr.SevenZipFile( output_7z, 'w', filters=[{'id': 'LZMA2', 'preset': 3, 'threads': -1}] ) as szf: szf.writeall(source_dir)
2. ZSTD格式(Zstandard)
ZSTD是专为速度与压缩率平衡设计的算法,快速模式下速度是ZIP的5-10倍,压缩率接近7Z平衡模式;即使高压缩率模式,速度也远超7Z。需要先安装zstandard库(pip install zstandard),示例代码:
import zstandard as zstd import shutil import os def compress_zstd(source_dir, output_zst): # 先打包为tar(ZSTD是单文件压缩算法,需配合tar处理文件夹) temp_tar = output_zst + ".tar" shutil.make_archive(temp_tar.rsplit('.', 1)[0], 'tar', source_dir) # ZSTD压缩,level=3:平衡模式;threads=-1:用全部CPU核心 cctx = zstd.ZstdCompressor(level=3, threads=-1) with open(temp_tar, 'rb') as f_in, open(output_zst, 'wb') as f_out: cctx.copy_stream(f_in, f_out) os.remove(temp_tar)
三、5GB+大文件的适配注意事项
- 上述所有方案均支持流式处理,不会将整个文件加载到内存,完全可以处理5GB以上的文件夹。
- 务必将压缩操作放到UI应用的后台线程(比如用
threading或concurrent.futures),避免界面卡顿。 - 放弃
shutil.make_archive,它的内存占用和单线程设计不适合大文件处理。
内容的提问来源于stack exchange,提问作者WhatTheClown
相关产品推荐
相关产品推荐

