Python * .py, * .pyo, * .pyc: Что может быть устранено для встроенной системы? - PullRequest
11 голосов
/ 12 мая 2009

Чтобы втиснуть ограниченный объем хранилища файловой системы, доступный во встроенной системе, с которой я сейчас играю, я хотел бы удалить любые файлы, которые могут быть разумно удалены без существенного влияния на функциональность или производительность. Файлы * .py, * .pyo и * .pyc в библиотеке Python занимают значительный объем пространства. Мне интересно, какой из этих вариантов будет наиболее целесообразным для установки Python 2.6 в небольшой встроенной системе:

  1. Сохранить * .py, устранить * .pyc и * .pyo (сохранить способность к отладке, снижается производительность?)
  2. Сохраните * .py и * .pyc, исключите * .pyo (Оптимизация действительно что-нибудь покупает?)
  3. Сохранить * .pyc, исключить * .pyo и * .py (это сработает?)
  4. Keep * .py, * .pyc и * .pyo (все нужно?)

Ответы [ 5 ]

13 голосов
/ 12 мая 2009

http://www.network -theory.co.uk / Docs / pytut / CompiledPythonfiles.html

Когда интерпретатор Python вызывается с флагом -O, оптимизированный код генерируется и сохраняется в файлах «.pyo». В настоящее время оптимизатор мало помогает; удаляет только утверждения assert.

Передача двух флагов -O интерпретатору Python (-OO) заставит компилятор байт-кода выполнить оптимизацию, которая в некоторых редких случаях может привести к сбоям в работе программ. В настоящее время из байт-кода удаляются только строки doc , что приводит к более компактным файлам .pyo.

Мое предложение для вас?

Используйте -OO для компиляции только .pyo файлов, если вам не нужны операторы assert и строки __doc__.

В противном случае используйте только .pyc .

Редактировать

Я заметил, что вы упомянули только библиотеку Python. Большая часть библиотеки Python может быть удалена, если вам нужна только часть функциональности.

Я также предлагаю вам взглянуть на tinypy , который является большим подмножеством Python примерно в 64 КБ.

3 голосов
/ 12 мая 2009

Номер 3 должен и будет работать. Вам не нужны файлы .pyo или .py, чтобы использовать скомпилированный код Python.

2 голосов
/ 12 мая 2009

Я бы рекомендовал хранить только файлы .py. Разница во времени запуска не так уж велика, и наличие исходного кода является плюсом, так как он будет работать под разными версиями Python без каких-либо проблем.

Начиная с python 2.6, установка sys.dont_write_bytecode в True будет подавлять компиляцию файлов .pyc и .pyo в целом, поэтому вы можете использовать эту опцию, если у вас есть 2.6.

1 голос
/ 03 сентября 2014

Вот как я минимизирую требования к диску для основного Python 2.7 на дневной работе:

1) Удалите пакеты из стандартной библиотеки, которая вам не понадобится. Ниже приводится консервативный список:

bsddb/test ctypes/test distutils/tests email/test idlelib lib-tk
lib2to3 pydoc.py tabnanny.py test unittest

Обратите внимание, что некоторые коды Python могут иметь неожиданные зависимости; например setuptools требуется unittest для запуска.

2) Предварительно скомпилируйте весь код Python, используя -OO для удаления утверждений и строк документации.

find -name '*.py' | python -OO -m py_compile -

Обратите внимание, что Python по умолчанию не смотрит на .pyo файлы; Вы также должны явно запросить оптимизацию во время выполнения, используя опцию или переменную окружения. Запустите сценарии одним из следующих способов:

python -OO -m mylib.myscript
PYTHONOPTIMIZE=2 python -m mylib.myscript

3) Удалите .py файлы исходного кода (если вам не нужно запускать их как скрипты) и .pyc неоптимизированные файлы.

find '(' -name '*.py' -or -name '*.pyc' ')' -and -not -executable -execdir rm '{}' ';'

4) Сжать файлы библиотеки Python. Python может загружать модули из zip-файла. Пути в zip-файле должны соответствовать иерархии пакетов; таким образом, вы должны объединить каталоги site-packages и .egg в основной каталог библиотеки перед архивированием. (Или вы можете добавить несколько zip-файлов в путь Python.)

В Linux путь Python по умолчанию включает уже /usr/lib/python27.zip, поэтому просто поместите туда zip-файл, и вы готовы к работе.

Оставьте os.pyo как обычный (не заархивированный) файл, так как Python ищет это как проверку работоспособности. Если вы переместите его в zip-файл, вы получите предупреждение при каждом вызове Python (хотя все будет работать). Или вы можете просто оставить там пустой файл os.py и поместить настоящий файл в zip-файл.

Заключительные замечания:

  • Таким образом, Python помещается в 7 МБ дискового пространства. Можно сделать гораздо больше, чтобы уменьшить размер, но 7 МБ было достаточно мало для моих целей. :)
  • Байт-код Python не совместим между версиями, но кого это волнует, когда именно вы выполняете компиляцию, а вы контролируете версию Python?
  • .pyo файлы в zip-файле должны быть выигрышем в производительности во всех случаях, если только диск не очень быстрый, а процессор / ОЗУ очень медленный. В любом случае, Python выполняется из памяти, а не из формата на диске, поэтому он влияет только на производительность при загрузке. Хотя удаление строк документации может сэкономить немного памяти.
  • Обратите внимание, что .pyo файлы не содержат assert операторов.
  • .pyo файлы сохраняют имена функций и номера строк, поэтому отладка не уменьшается: вы все равно получаете хорошие трассировки, вам просто нужно вручную найти номер строки в источнике, что вам в любом случае придется делать.
  • Если вы хотите «взломать» файл во время выполнения, просто поместите его в текущий рабочий каталог. Он имеет приоритет над zip-файлом библиотеки.
1 голос
/ 12 мая 2009

То, что в конечном итоге сводится к тому, что вам действительно нужен только один из трех вариантов, но ваш лучший выбор - использовать .pys и .pyos или .pycs.

Вот как я вижу каждый из ваших вариантов:

  1. Если вы поместите .pys в zip-файл, вы не увидите pycs или pyos. Следует также отметить, что разница в производительности заключается только во времени запуска, и даже в этом случае, по моему опыту, она не слишком велика (хотя ваш пробег может варьироваться). Также обратите внимание, что есть способ запретить интерпретатору выводить .pycs, как указывает Algorias .
  2. Я думаю, что это идеальный вариант (или тот, или .pys и .pyos), потому что вы получаете лучшее сочетание производительности, отладки и надежности. Вам не обязательно нужен исходный файл и скомпилированный файл.
  3. Если вы действительно ограничены в пространстве и нуждаетесь в производительности, это сработает. Я бы посоветовал вам сохранить .pys, если это вообще возможно. Скомпилированные двоичные файлы (.pycs или .pyos) не всегда переносятся в разные версии python.
  4. Сомнительно, что вам понадобятся все три, если вы не планируете иногда работать в оптимизированном режиме и иногда в неоптимизированном режиме.

С точки зрения пространства, мой (очень анекдотичный) опыт показывает, что файлы .py сжимают лучше, чем .pycs и .pyos, если вы помещаете их в zip-файл. Если вы планируете сжимать файлы, .pyos вряд ли получит большую выгоду с точки зрения чистого пространства, потому что строки документов имеют тенденцию сжиматься довольно хорошо и утверждают, что просто не занимают так много места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...