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

时间:2010-04-29 16:13:35

标签: python memory-management docstring

我理解在Python中,字符串只是一个表达式,并且在将控制权返回给代码的调用者时,字符串本身就会被垃圾收集,但是......

  1. 大型课程/方法doc字符串 你的代码:他们浪费了记忆 通过构建字符串对象?
  2. 模块级doc字符串:是吗? 由翻译无限地存储?
  3. 这是否重要?我唯一关心的问题是,如果我使用像Django这样的大型框架,或者使用多个大型开源库,那么它们往往会被很好地记录下来,可能有多兆字节的文本。在这些情况下,doc文件字符串是加载到内存中的,用于沿途使用的代码,然后保存在那里,还是像普通字符串一样立即收集?

2 个答案:

答案 0 :(得分:9)

  • “我知道在Python中,字符串只是一个表达式,并且在将控制权返回给代码的调用者时,字符串本身会立即被垃圾收集”,这表示存在误解,我认为。文档字符串被评估一次(不是在每个函数调用上),并且至少与函数一样长时间保持活动状态。

  • “这甚至不重要吗?”当谈到优化时,不是通过抽象地思考而是通过测量来回答。在内存密集型应用程序中,“多兆字节”的文本可能不是很多。节省记忆的解决方案可能存在于其他地方,您可以通过测量确定是否属于这种情况。

  • Python的-OO命令行开关删除了文档字符串。

答案 1 :(得分:2)

默认情况下,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文件相同。任何人都可以解释这种行为吗?