python 解压缩——非常慢?

问题描述 投票:0回答:4

有人可以解释一下以下的谜团吗?

我创建了一个大小约为 37[MB] 的二进制文件。在 Ubuntu 中使用终端压缩它花费了不到 1[秒]。然后我尝试了 python:以编程方式压缩它(使用 zipfile 模块)也花费了大约 1[秒]。

然后我尝试解压缩我创建的 zip 文件。在 Ubuntu 中——使用终端——这花费了不到 1[秒]。

在Python中,解压代码(使用zipfile模块)需要接近37[秒]才能运行!有什么想法吗?

python linux ubuntu zip unzip
4个回答
2
投票

我也在努力使用Python解压缩/解压缩/提取zip文件,并且“创建ZipFile对象,循环遍历其.namelist(),读取文件并将它们写入文件系统”低级方法似乎不太好Python。所以我开始挖掘 zipfile 对象,我认为这些对象没有很好的文档记录并涵盖了所有对象方法:

>>> from zipfile import ZipFile
>>> filepath = '/srv/pydocfiles/packages/ebook.zip'
>>> zip = ZipFile(filepath)
>>> dir(zip)
['NameToInfo', '_GetContents', '_RealGetContents', '__del__', '__doc__', '__enter__', '__exit__', '__init__', '__module__', '_allowZip64', '_didModify', '_extract_member', '_filePassed', '_writecheck', 'close', 'comment', 'compression', 'debug', 'extract', 'extractall', 'filelist', 'filename', 'fp', 'getinfo', 'infolist', 'mode', 'namelist', 'open', 'printdir', 'pwd', 'read', 'setpassword', 'start_dir', 'testzip', 'write', 'writestr'] 

“extractall”方法的工作原理就像 tarfile 的 extractall 一样! (适用于 python 2.6 和 2.7,但不适用于 2.5)

然后是性能问题;文件 ebook.zip 为 84.6 MB(主要是 pdf 文件),未压缩的文件夹为 103 MB,在 MacOSx 10.5 下通过“Archive Utility”默认压缩。所以我对 Python 的 timeit 模块做了同样的事情:

>>> from timeit import Timer
>>> t = Timer("filepath = '/srv/pydocfiles/packages/ebook.zip'; \
...         extract_to = '/tmp/pydocnet/build'; \
...         from zipfile import ZipFile; \
...         ZipFile(filepath).extractall(path=extract_to)")
>>> 
>>> t.timeit(1)
1.8670060634613037

在负载较重且 90% 的内存正被其他应用程序使用的机器上花费了不到 2 秒的时间。

希望这对某人有帮助。


0
投票

我不知道您使用什么代码来解压缩文件,但以下代码对我有用:创建仅包含一个文件“file1”的 zip 存档“test.zip”后,以下 Python 脚本从存档:

from zipfile import ZipFile, ZIP_DEFLATED
zip = ZipFile("test.zip", mode='r', compression=ZIP_DEFLATED, allowZip64=False)
data = zip.read("file1")
print len(data)

这几乎不需要时间:我尝试了一个 37MB 的输入文件,该文件被压缩为 15MB 的 zip 存档。在此示例中,Python 脚本在我的 MacBook Pro 上花费了 0.346 秒。也许在你的情况下,这 37 秒被你对数据所做的事情占用了?


0
投票

我们可以使用 ubuntu 在 python 中提供的 zip 功能,而不是使用 python 模块。我使用这个是因为有时 python zip 会失败。

import os

filename = test
os.system('7z a %s.zip %s'% (filename, filename))

0
投票

一些选项:

  • 使用
    subprocess
    将其推迟到某些外部工具。您可以将数据直接传输到它。
  • czipfile,但似乎不再维护(最后一个版本 2010)。最近的一个分支是 ziyuang/czipfile (最后更新于 2019 年)。
  • PyTorch 具有内部原生
    torch._C.PyTorchFileReader
    ,可以读取 zip 文件,查看
    torch.load
    逻辑,以及
    _open_zipfile_reader
  • libzip.py (2023) 是 libzip 的 ctypes 包装器。但好像很陌生?
© www.soinside.com 2019 - 2024. All rights reserved.