Может кто-нибудь объяснить следующую тайну?
Я создал двоичный файл размером ~ 37 [МБ]. застегивая его в Ubuntu - используя терминал - заняло менее 1 [сек]. Затем я попробовал python: его программное программирование (с использованием zipfile-модуля) заняло около 1 [сек].
Затем я попытался разархивировать созданный zip файл. В Ubuntu - с использованием терминала - это заняло менее 1 [сек].
В python код для распаковки (используется zipfile-модуль) занял около 37 [сек] для запуска! любые идеи, почему?
Я пытался распаковывать/распаковывать/извлекать zip файлы с помощью Python, а также "создавать объект 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 МБ (в основном pdf файлы), а несжатая папка - 103 МБ, по умолчанию - "Утилита архива" в MacOSx 10.5. Поэтому я сделал то же самое с Python timeit module:
>>> 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% памяти используется другими приложениями.
Надеюсь, это поможет кому-то.
Вместо использования модуля python мы можем использовать zip-функцию, предлагаемую ubuntu в python. Я использую это, потому что иногда python zip терпит неудачу.
import os
filename = test
os.system('7z a %s.zip %s'% (filename, filename))
str.format()
вместо форматирования%, например os.system('7z a {0}.zip {0}'.format(filename))
. Как они упоминают в документах , он будет удален в будущем, и я верю, что он уже вышел в 3+.
import subprocess; subprocess.call(['7z', 'a', filename+'.zip', filename])
. Или что произойдет, если имя файла содержит пробел или символ новой строки?
Я не знаю, какой код вы используете для распаковки вашего файла, но для меня работает следующее: после создания zip-архива "test.zip", содержащего только один файл "file1", следующие выходы Python script 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 Мбайт, который сжимал до 15-мегабайтного zip-архива. В этом примере Python script занял 0.346 секунд на моем MacBook Pro. Может быть, в вашем случае 37 секунд были заняты тем, что вы сделали с данными?