Python - большие строки документа тратят память? - PullRequest
2 голосов
/ 29 апреля 2010

Я понимаю, что в Python строка - это просто выражение, и строка сама по себе будет собирать мусор сразу после возврата управления вызывающей стороне кода, но ...

  1. Большие строки документа класса / метода в ваш код: они тратят память построив строковые объекты?
  2. Строки документа уровня модуля: они хранится бесконечно переводчиком?

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

Ответы [ 2 ]

9 голосов
/ 29 апреля 2010
  • «Я понимаю, что в Python строка - это просто выражение, и строка сама по себе будет собирать мусор сразу же после возврата контроля вызывающему коду», - думаю, это неверное понимание. Строка документа вычисляется один раз (не при каждом вызове функции) и остается в живых, по крайней мере, до тех пор, пока эта функция выполняется.

  • "Это вообще имеет значение?" когда дело доходит до оптимизации, на нее отвечают не абстрактно, а с помощью измерения. «Несколько мегабайт» текста, вероятно, не так уж много в приложении, интенсивно использующем память. Решение для сохранения памяти, вероятно, живет в другом месте, и вы можете определить, так ли это по измерениям.

  • Переключатель командной строки Python -OO удаляет строки документов.

2 голосов
/ 29 апреля 2010

Строки документации Python по умолчанию хранятся неопределенно долго, так как они доступны через атрибут __doc__ функции или модуля. Например, со следующим в test.py:

"""This is a test module."""

def f():
   """This is a test function."""
   pass

Тогда:

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__doc__
'This is a test module.'
>>> test.f.__doc__
'This is a test function.'
>>> 

Опция -OO для интерпретатора, очевидно, заставляет его удалять строки документации из сгенерированных .pyo файлов, но это не дает ожидаемого эффекта:

$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.py'
>>> 
$ grep "This is a test" /tmp/test.pyo
Binary file /tmp/test.pyo matches
$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.pyo'
>>> test.__doc__
'This is a test module.'
>>> 

И действительно, файл test.pyo, созданный с помощью -OO, идентичен файлу test.pyc, созданному без аргументов командной строки. Кто-нибудь может объяснить это поведение?

...