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

时间:2009-12-30 23:55:57

标签: python comments memory-management docstring

  

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

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

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

我已经在论坛,Google和邮件列表中进行了搜索,但我没有找到任何相关信息。

你知道的更好吗?

4 个答案:

答案 0 :(得分:23)

默认情况下,文档字符串存在于.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

你可以拥有以下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

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

答案 1 :(得分:10)

是的,从文件中读取了文档字符串,但这不应该阻止您编写它们。在您完成性能测试并发现您担心的事实上是您的程序中导致问题的瓶颈之前,永远不会损害性能代码的可读性。我认为文档字符串极不可能在任何现实世界的情况下对性能产生任何可衡量的影响。

答案 2 :(得分:5)

他们 从文件中读取(当文件编译为pyc或加载pyc时 - 它们必须在object.__doc__下可用)但否< / strong> - &gt;这不会对任何合理情况下的性能产生重大影响,或者您是否真的在编写多兆字节的文档字符串?

答案 3 :(得分:1)

  

Python文档字符串和注释是否正确   模块存储在内存中   装?

Docstrings被编译到.pyc文件中,并被加载到内存中。编译期间丢弃注释,除了在编译期间忽略它们所花费的微不足道的额外时间之外没有任何影响(只有在对.py文件进行任何更改之后才会发生一次,除了每次重新编译的主脚本之外运行)。

另请注意,仅当这些字符串是模块,类定义或函数定义中的第一个事物时,才会保留这些字符串。您可以在任何地方包含其他字符串,但在编译期间它们将被丢弃,就像注释一样。