处理大文件的最佳Python压缩模块是什么?

9 投票
2 回答
10163 浏览
提问于 2025-04-15 16:09

编辑:具体来说,是关于压缩和解压缩的速度。

有什么建议吗?

谢谢!

2 个回答

5

如果你想处理大文件,但又不想把它们全部加载到内存中,可以使用Python 2.6版本中基于流的方法,比如ZipFile.open不要使用extractextractall,除非你已经对ZIP文件中的文件名进行了严格的清理。

以前你需要把所有字节都读入内存,或者像zipstream那样进行一些变通;现在这些方法已经过时了。

15

我做了一个随机的大压缩文件:

$ ls -l *zip
-rw-r--r--  1 aleax  5000  115749854 Nov 18 19:16 large.zip
$ unzip -l large.zip | wc
   23396   93633 2254735

也就是说,这个文件有116MB,里面有23400个文件,我还记录了时间:

$ time unzip -d /tmp large.zip >/dev/null

real    0m14.702s
user    0m2.586s
sys         0m5.408s

这是系统自带的命令行解压工具——肯定是经过精心调试和优化的纯C程序。然后(在清理/tmp之后;-):

$ time py26 -c'from zipfile import ZipFile; z=ZipFile("large.zip"); z.extractall("/tmp")'

real    0m13.274s
user    0m5.059s
sys         0m5.166s

...这是用Python和它的标准库来解压的——虽然对CPU的要求稍微高一些,但实际用时快了超过10%。

当然,你也可以在你自己的平台上重复这样的测试——如果你的设备CPU性能差,比如说是个慢的ARM芯片,那么Python对CPU的额外需求可能会让它变得更慢——而且你测试的压缩文件也会影响结果,因为每个大压缩文件的内容和性能可能差别很大。不过,这让我觉得,想要做一个比老牌的zipfile更快的Python扩展,空间并不大——因为用Python的这个库解压的速度比系统自带的纯C解压工具还要快!

撰写回答