Python的ZipFile模块解压有密码保护的zip文件速度较慢。

6
我正在尝试编写一个Python脚本,应该可以提取zip文件:
板子:Beagle-Bone黑色 ~1GHz Arm-Cortex-a8 ,debian wheezy Zip文件:/home/milo/my.zip,~8 MB
>>> from zipfile import ZipFile
>>> zip = ZipFile("/home/milo/my.zip")
>>> zip.extractall(pwd="tst")

使用打开和读取->编写zipfile并提取甚至特定文件的其他解决方案具有相同的效果。提取需要大约3-4分钟。

仅使用解压缩工具提取相同文件只需少于2秒钟。

是否有人知道我的代码有什么问题,甚至是Python zipfile库?

谢谢 Ajava


解压缩速度是否受到ZIP文件是否有密码保护的影响? - Mikko Ohtamaa
不,如果相同的zip文件没有密码保护,相同的代码会像解压缩一样快地提取所有内容!!! - arash javanmard
1
即使在我的个人电脑上(i5,8GB RAM,Debian Wheezy),通过Python解压一个30 MB的密码保护zip文件也需要超过1分钟的时间!! - arash javanmard
2个回答

7
这似乎是Python 2.7中ZipFile模块的已知问题。如果您查看ZipFile文档,它清楚地说明:

解密速度非常慢,因为它是使用本地Python实现而不是C实现。

如果您需要更快的性能,可以从代码中调用外部程序(如unzip或7zip),或确保您正在处理的zip文件没有密码保护。


1

从我的答案中复制https://stackoverflow.com/a/72513075/10860732

很愚蠢的是Python没有在纯C中实现zip解密。

所以我用cython做了它,速度快了17倍。

只需从这个gist获取dezip.pyx和setup.py。

https://gist.github.com/zylo117/cb2794c84b459eba301df7b82ddbc1ec

安装Cython并构建一个Cython库

pip3 install cython
python3 setup.py build_ext --inplace

然后再加上两行代码,运行原始脚本。

import zipfile

# add these two lines
from dezip import _ZipDecrypter_C
setattr(zipfile, '_ZipDecrypter', _ZipDecrypter_C)

z = zipfile.ZipFile('./test.zip', 'r')
z.extractall('/tmp/123', None, b'password')

这适用于大型压缩文件。 - oeter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接