Python - 大的文档字符串会浪费内存吗?
我明白在Python中,字符串其实就是一种表达方式,单独的字符串在代码执行完后会立刻被垃圾回收掉。但是……
- 代码中的大段类或方法文档字符串:它们会因为构建字符串对象而浪费内存吗?
- 模块级别的文档字符串:它们会被解释器无限期地存储吗?
这真的重要吗?我唯一担心的是,如果我使用像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
命令行开关会去掉文档字符串。