【问题标题】:Python - do big doc strings waste memory?Python - 大文档字符串会浪费内存吗?
【发布时间】:2011-02-13 21:33:38
【问题描述】:

我知道在 Python 中,字符串只是一个表达式,而字符串本身会在将控制权返回给代码调用者后立即被垃圾收集,但是...

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

这还重要吗?我唯一担心的想法是,如果我使用像 Django 这样的大型框架或多个大型开源库,它们往往有很好的文档记录,可能有数兆字节的文本。在这些情况下,文档字符串是否会被加载到内存中以供沿途使用的代码使用,然后保存在那里,还是像普通字符串一样立即收集?

【问题讨论】:

标签: python memory-management docstring


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

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

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

【讨论】:

    【解决方案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.'
    >>> 
    

    事实上,使用-OO 生成的test.pyo 文件与不使用命令行参数生成的test.pyc 文件相同。谁能解释这种行为?

    【讨论】:

    • 乍一看,我会说这是您的 Python 2.5.1 中的一个错误。它在我这里的 2.5.5 上按预期工作。根据 NEWS 文件,Python 2.5.1c1 有这个错误,但它应该在实际的 2.5.1 版本中得到修复。见bugs.python.org/issue1722485
    猜你喜欢
    • 2016-05-28
    • 2021-02-07
    • 2017-04-08
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多