2009-12-30 91 views
9

加载模块时是否将Python文档和注释存储在内存中?模块加载时Python文档和注释是否存储在内存中?

我想知道如果这是真的,因为我通常记录我的代码;可能会影响内存使用情况?

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

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

你知道吗?

+4

只是为了澄清,docstrings不是评论。它们是相似的,并且用于类似的目的,但是文档字符串实际上是函数/对象的属性,但我不认为除了实际读取.py文件本身之外,其他任何方式都可以访问这些注释。 – MatrixFrog 2009-12-31 00:00:17

+0

有多少内存会担心可能会使用?每个字符多于1个字节?你在编程Timex Sinclair 1000吗? – 2009-12-31 00:40:02

回答

22

默认情况下,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 

你可以有以下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文件即使在使用-OO之后也是327字节,因为.pyo文件仍在,并且Python没有重建/覆盖它,它只是使用现有文件。删除现有的.pyo(或者等同于touch foo.py,以便Python知道.pyo“过时”)意味着Python重新构建它(并且在这种情况下,在磁盘上保存123个字节,并且在模块导入时多一点点 - 但所有.__doc__条目消失并被替换为None)。

+0

现在很明显。非常好的答案。 – 2009-12-31 01:35:39

+0

顺便提一下,单机字符串不是文档字符串(未在函数,类,或模块的顶部)产生[无代码(https://twitter.com/gvanrossum/status/112670605505077248)在任何优化级别。它们不在.pyc或.pyo文件中。他们是真正的**多行评论**。 – 2017-04-08 11:31:07

4

他们从文件(当文件被编译到PYC或加载PYC的时候 - 他们必须object.__doc__下可用)得到读取,但没有 - >这不会显著影响性能在任何合理的情况下,还是你真的在写几兆字节的文档字符串?

+0

+1良好和幽默的答案和**没有**,我*不写*多兆字节文档字符串;) – 2009-12-31 00:05:34

7

是从文件中读取文档字符串,但不应该阻止您编写它们。永远不要妥协性能的代码的可读性,直到你做了性能测试,发现你担心的事实上是你的程序中的瓶颈造成了问题。我认为,在任何现实世界的情况下,文档字符串都不会对性能造成任何可衡量的影响是极不可能的。

1

当模块被加载时,Python文档和注释是 存储在内存中吗?

Docstrings被编译到.pyc文件中,并被加载到内存中。注释在编译过程中被丢弃,除了在编译过程中忽略它们所花费的额外时间(除非每次重新编译主脚本时重新编译一次.py文件之后才会发生一次)跑)。

另请注意,这些字符串仅在模块,类定义或函数定义中的第一个事件被保留。你可以在任何地方包含额外的字符串,但是在编译过程中它们将被丢弃,就像注释一样。

相关问题