Сохраняются ли строки документации Python и комментарии в памяти при загрузке модуля?

StackOverflow https://stackoverflow.com/questions/1983177

Вопрос

Сохраняются ли строки документации Python и комментарии в памяти при загрузке модуля?

Я задавался вопросом, правда ли это, потому что обычно я хорошо документирую свой код;может ли это повлиять на использование памяти?

Обычно каждый объект Python имеет __doc__ способ.Считываются ли эти строки документации из файла или обрабатываются иным образом?

Я провел поиск здесь, на форумах, в Google и Списках рассылки, но не нашел никакой релевантной информации.

Ты знаешь лучше?

Это было полезно?

Решение

По умолчанию строки документов присутствуют в .pyc файл байт-кода и загружаются из них (комментарии отсутствуют).Если вы используете python -OO (тот -OO флаг означает "интенсивно оптимизировать", в отличие от -O что расшифровывается как "мягко оптимизировать"), вы получаете и используете .pyo файлы вместо .pyc файлы, и они оптимизируются путем исключения строк документации (в дополнение к оптимизации, выполняемой -O, которые удаляют assert заявления).Например, рассмотрим файл foo.py это имеет:

"""This is the documentation for my module foo."""

def bar(x):
  """This is the documentation for my function foo.bar."""
  return x + 1

у вас мог бы быть следующий сеанс командной строки...:

$ python -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyc
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyc
$ python -O -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
23
This is the documentation for my module foo.
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
$ rm foo.pyo
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
23
None
$ ls -l foo.pyo
-rw-r--r--  1 aleax  eng  204 Dec 30 16:17 foo.pyo

Обратите внимание, что, поскольку мы использовали -O во-первых, .pyo размер файла составлял 327 байт - даже после использования -OO, потому что .pyo файл все еще существовал, и Python не перестраивал / перезаписывал его, он просто использовал существующий.Удаление существующего .pyo (или, что эквивалентно, touch foo.py таким образом, чтобы Python знал .pyo является "устаревшим") означает, что Python перестраивает его (и, в данном случае, сохраняет 123 байта на диске и немного больше при импорте модуля - но все .__doc__ записи исчезают и заменяются None).

Другие советы

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

Они являются получение чтения из файла (когда файл скомпилирован в pyc или когда pyc загружен - они должны быть доступны в object.__doc__) но НЕТ --> это не окажет существенного влияния на производительность ни при каких разумных обстоятельствах, или вы действительно пишете многомегабайтные строки документов?

Сохраняются ли строки документации Python и комментарии в памяти при загрузке модуля ?

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

Также обратите внимание, что эти строки сохраняются только в том случае, если они являются Первый вещь в модуле, определении класса или определении функции.Вы можете включать дополнительные строки практически в любом месте, но они будут отброшены во время компиляции так же, как и комментарии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top