Сохраняются ли строки документации Python и комментарии в памяти при загрузке модуля?
-
22-09-2019 - |
Вопрос
Сохраняются ли строки документации 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, за исключением основного скрипта, который повторно компилируется при каждом запуске).
Также обратите внимание, что эти строки сохраняются только в том случае, если они являются Первый вещь в модуле, определении класса или определении функции.Вы можете включать дополнительные строки практически в любом месте, но они будут отброшены во время компиляции так же, как и комментарии.