Разархивировать Python - очень медленно? - PullRequest
4 голосов
/ 15 февраля 2011

Может кто-нибудь объяснить, пожалуйста, следующую загадку?

Я создал двоичный файл размером ~ 37 [МБ].архивирование в Ubuntu с использованием терминала заняло менее 1 секунды.Затем я попробовал python: программное архивирование (с использованием модуля zipfile) также заняло около 1 [с].

Затем я попытался распаковать созданный мною zip-файл.В Ubuntu - с использованием терминала - это заняло менее 1 [сек].

В python код для распаковки (использовался модуль zipfile) занял около 37 [сек] для запуска!есть идеи почему?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Я изо всех сил пытался распаковать / распаковать / распаковать zip-файлы с помощью Python, и что «низкоуровневый подход« создать объект ZipFile, перебрать его .namelist (), прочитать файлы и записать их в файловую систему ») кажется очень питоном. Поэтому я начал копать объекты 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", который работает так же, как extractall из tarfile ! (на python 2.6 и 2.7, но НЕ 2.5)

Тогда производительность касается; файл ebook.zip имеет размер 84,6 МБ (в основном PDF-файлы), а размер несжатой папки - 103 МБ. По умолчанию архивируется «Утилита архивирования» в MacOSx 10.5. Я сделал то же самое с модулем 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

, что заняло менее 2 секунд на сильно загруженном компьютере с 90% памяти, который используется другими приложениями.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 06 июня 2011

Вместо использования модуля python мы можем использовать zip-файл, предлагаемый ubuntu в python.Я использую это, потому что иногда происходит сбой почтового индекса.

import os

filename = test
os.system('7z a %s.zip %s'% (filename, filename))
0 голосов
/ 07 марта 2011

Я не знаю, какой код вы используете для распаковки вашего файла, но у меня работает следующее: После создания zip-архива «test.zip», содержащего только один файл «file1», следующий скрипт Python извлекает «file1»из архива:

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

Это почти не занимает времени: я попробовал входной файл размером 37 МБ, который сжался в ZIP-архив размером 15 МБ.В этом примере скрипт Python занял 0,346 секунды на моем MacBook Pro.Может быть, в вашем случае 37 секунд были заняты чем-то, что вы сделали вместо данных?

...