我知道在 Python 中,字符串只是一个表达式,而字符串本身会在将控制权返回给代码调用者后立即被垃圾收集,但是......
- 代码中的大型类/方法文档字符串:它们是否通过构建字符串对象来浪费内存?
- 模块级文档字符串:它们是否被解释器无限存储?
这还重要吗?我唯一担心的想法是,如果我使用像 Django 这样的大型框架或多个大型开源库,它们往往有很好的文档记录,可能有数兆字节的文本。在这些情况下,文档字符串是否会加载到内存中以供沿途使用的代码使用,然后保存在那里,还是像普通字符串一样立即收集?
我知道在 Python 中,字符串只是一个表达式,而字符串本身会在将控制权返回给代码调用者后立即被垃圾收集,但是......
这还重要吗?我唯一担心的想法是,如果我使用像 Django 这样的大型框架或多个大型开源库,它们往往有很好的文档记录,可能有数兆字节的文本。在这些情况下,文档字符串是否会加载到内存中以供沿途使用的代码使用,然后保存在那里,还是像普通字符串一样立即收集?
“我知道,在 Python 中,字符串只是一个表达式,而字符串本身会在将控制权返回给代码调用者后立即被垃圾收集”,我认为这是一种误解。一个文档字符串被评估一次(不是在每个函数调用上)并且至少与函数一样长时间保持活动状态。
“这还重要吗?” 当涉及到优化时,不是通过抽象地思考而是通过测量来回答的。“数兆字节”的文本在内存密集型应用程序中可能不是很多。节省内存的解决方案可能存在于其他地方,您可以通过测量确定是否是这种情况。
Python 的-OO
命令行开关删除文档字符串。
默认情况下,Python 文档字符串被无限期保留,因为它们可以通过函数或模块的 __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.'
>>>
事实上,test.pyo
生成的文件与不使用命令行参数生成-OO
的文件相同。test.pyc
谁能解释这种行为?