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

16 投票
5 回答
4528 浏览
提问于 2025-04-15 17:29

Python的文档字符串和注释在模块加载时会存储在内存中吗?

我一直在想这个问题,因为我通常会把我的代码写得很清楚;这会影响内存的使用吗?

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

我在论坛、谷歌和邮件列表上搜索过,但没有找到相关的信息。

你知道得更清楚吗?

5 个回答

5

这些内容确实是从文件中读取的(当文件被编译成pyc文件时,或者当pyc文件被加载时——它们必须可以在object.__doc__下找到),但是——在任何合理的情况下,这不会对性能产生显著影响,难道你真的在写几兆字节的文档字符串吗?

13

是的,文档字符串是从文件中读取的,但这并不应该阻止你去写它们。绝对不要为了性能而牺牲代码的可读性,除非你做过性能测试,发现你担心的地方确实是程序中的瓶颈,导致了问题。我认为在实际情况中,文档字符串对性能的影响几乎是可以忽略不计的。

26

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

你可以进行如下的命令行操作...:

$ 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)。

撰写回答