Python - 大的文档字符串会浪费内存吗?

2 投票
2 回答
904 浏览
提问于 2025-04-15 22:10

我明白在Python中,字符串其实就是一种表达方式,单独的字符串在代码执行完后会立刻被垃圾回收掉。但是……

  1. 代码中的大段类或方法文档字符串:它们会因为构建字符串对象而浪费内存吗?
  2. 模块级别的文档字符串:它们会被解释器无限期地存储吗?

这真的重要吗?我唯一担心的是,如果我使用像Django这样的大框架,或者多个大型开源库,它们的文档通常非常详细,可能会有好几兆的文本。在这种情况下,这些文档字符串会在使用过程中加载到内存中,然后一直保留在那里,还是像普通字符串一样立刻被回收掉呢?

2 个回答

2

在Python中,文档字符串(docstrings)默认是永久保留的,因为你可以通过函数或模块的__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.'
>>> 

实际上,使用-OO生成的test.pyo文件和没有任何命令行参数生成的test.pyc文件是完全一样的。有没有人能解释一下这种情况?

10
  • “我理解在Python中,字符串只是一个表达式,字符串本身在控制权返回给调用代码后会立即被垃圾回收。”这句话我觉得有点误解。文档字符串(docstring)只会被评估一次(而不是每次调用函数时都评估),并且至少会在函数的生命周期内一直存在。

  • “这真的重要吗?”在优化方面,这个问题不能仅仅通过抽象思考来回答,而是需要通过测量来确定。“多个兆字节”的文本在内存占用较大的应用中可能并不算多。节省内存的解决方案可能在其他地方,你可以通过测量来判断是否如此。

  • Python的-OO命令行开关会去掉文档字符串。

撰写回答