加载模块时,Python文档字符串和注释是否存储在内存中?

Ken*_*yer 10 python comments memory-management docstring

加载模块时,Python文档字符串和注释是否存储在内存中?

我想知道这是否属实,因为我通常会很好地记录我的代码; 这可能会影响内存使用吗?

通常每个Python对象都有一个__doc__方法.这些文档字符串是从文件中读取还是以其他方式处理?

我在论坛,谷歌和邮件列表中进行了搜索,但我没有找到任何相关信息.

你知道的更好吗?

Ale*_*lli 24

默认情况下,docstrings存在于.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
Run Code Online (Sandbox Code Playgroud)

你可以有以下shell会话...:

$ 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
Run Code Online (Sandbox Code Playgroud)

请注意,因为我们-O首先使用,所以.pyo文件是327字节 - 即使在使用之后-OO,因为.pyo文件仍在,并且Python没有重建/覆盖它,它只使用现有文件.删除现有的.pyo(或等效地,touch foo.py以便Python知道.pyo"已过时")意味着Python重建它(在这种情况下,在磁盘上保存123个字节,在模块导入时稍微多一点 - 但是所有.__doc__条目都消失并被替换为None).

  • 顺便说一句,不是文档字符串的独立字符串(不在函数、类或模块的顶部)在任何优化级别都会生成[无代码](https://twitter.com/gvanrossum/status/112670605505077248)。它们不在 .pyc 或 .pyo 文件中。它们是真正的**多行注释**。 (2认同)

Mar*_*ers 10

是的,从文件中读取文档字符串,但这不应该阻止您编写它们.从来没有妥协的代码的可读性性能,直到你做了性能测试,发现你所担心的事情其实是在你的程序是导致问题的瓶颈.我认为文档字符串极不可能在任何实际情况下对性能产生任何可衡量的影响.


Chr*_*heD 5

他们正在从文件中读取(当文件被编译为pyc或加载pyc时 - 它们必须在下面可用object.__doc__)但是没有 - >这在任何合理的情况下都不会显着影响性能,或者你真的在写多兆字节的doc-strings?