我知道,在Python中,字符串只是一个表达式,字符串本身将是在控制返回代码呼叫者后立即收集的垃圾,但是...

  1. 代码中的大型类/方法文档字符串:它们是否通过构建字符串对象来浪费内存?
  2. 模块级文档字符串:它们是否由解释器无限存储?

这甚至重要吗?我唯一的关注是这样的想法是,如果我使用诸如Django或多个大型开源库之类的大框架,那么它们往往会得到充分的文献记载,并有可能具有多个兆字节的文本。在这些情况下,是否将DOC字符串加载到途中使用的代码内存中,然后将其保留在那里,还是像普通字符串一样立即收集?

有帮助吗?

解决方案

  • 我认为:“我知道,在Python中,一个字符串只是一个表达式,一根字符串本身就是在控制权回到代码呼叫者后立即收集的垃圾。”我认为这是一种误解。评估一次DOCSTRING(并非每个函数调用),并且至少与函数相比保持活跃。

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

  • python's -OO 命令行开关删除Docstrings。

其他提示

默认情况下,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.'
>>> 

实际上, test.pyo 生成的文件 -OOtest.pyc 没有命令行参数生成的文件。谁能解释这种行为?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top