docstrings Python и комментарии хранятся в памяти, когда модуль загружается?
Я задался вопросом, верно ли это, потому что я обычно документирую свой код хорошо; это может влиять на использование памяти?
Обычно каждый объект Python имеет a __doc__
метод. Те docstrings читаются из файла или обрабатываются иначе?
Я сделал поиски здесь на форумах, Google и Списках рассылки, но я не нашел релевантной информации.
Вы знаете лучше?
По умолчанию строки документации присутствуют в файле байт-кода .pyc
и загружаются из них (комментарии - нет). Если вы используете python -OO
(флаг -OO
означает «интенсивная оптимизация», в отличие от -O
, который означает «умеренно оптимизировать»), вы получить и использовать файлы .pyo
вместо файлов .pyc
, и они оптимизированы путем исключения строк документации (в дополнение к оптимизации, выполненной -O
, которая remove 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 байта и немного b это больше, когда модуль импортирован - но все записи .__ doc __
исчезают и заменяются на None
).
Да, docstrings считываются из файла, но это не должно останавливать их запись. Никогда никогда не компрометирует читабельность кода для производительности, пока Вы не сделаете тест производительности и не обнаружите, что то, о чем Вы беспокоитесь, на самом деле является тем узким местом в Вашей программе, которое вызывает проблему. Я бы подумал, что крайне маловероятно, что доктрина окажет сколько-нибудь заметное влияние на производительность в любой реальной ситуации.
Они получают чтение из файла (когда файл компилируется в pyc или когда загружается pyc - они должны быть доступны в объекте .__ doc__
) но нет -> это не окажет существенного влияния на производительность ни при каких разумных обстоятельствах, или вы действительно пишете многомегабайтные строки документов?
У Python Docstrings и комментарии хранится в памяти, когда модуль Загружены?
DocStrings Completed в файл .pyc и загружаются в память. Комментарии отбрасываются во время компиляции и не оказывают влияния на что-либо, кроме незначительного дополнительного времени, необходимого, чтобы игнорировать их во время компиляции (что происходит один раз только после каких-либо изменений в файл .py, кроме основного сценария, который переносится каждый раз, когда это пробег).
также обратите внимание, что эти строки сохраняются только в том случае, если они являются первыми первыми в модуле, определении класса или определении функции. Вы можете включить дополнительные строки в целом в любом месте, но они будут отброшены во время компиляции, так как комментарии.