【问题标题】:Are Python docstrings and comments stored in memory when a module is loaded?加载模块时,Python 文档字符串和注释是否存储在内存中?
【发布时间】:2010-12-31 06:56:51
【问题描述】:

加载模块时,Python 文档字符串和 cmets 是否存储在内存中?

我想知道这是不是真的,因为我通常会很好地记录我的代码;这会影响内存使用吗?

通常每个 Python 对象都有一个__doc__ 方法。这些文档字符串是从文件中读取的,还是以其他方式处理的?

我在论坛、Google 和邮件列表中进行了搜索,但没有找到任何相关信息。

你知道得更多吗?

【问题讨论】:

  • 澄清一下,文档字符串不是 cmets。它们相似,用途相似,但文档字符串实际上是函数/对象的属性,而我认为除了实际读取 .py 文件本身之外,无法以任何方式访问 cmets。
  • 担心会占用多少内存?每个字符超过 1 个字节?您正在为 Timex Sinclair 1000 编程吗?

标签: python comments memory-management docstring


【解决方案1】:

它们正在从文件中读取(当文件编译为 pyc 或加载 pyc 时 - 它们必须在 object.__doc__ 下可用)但 否 --> 这在任何合理的情况下都不会显着影响性能,还是您真的在编写数兆字节的文档字符串?

【讨论】:

  • +1 好幽默的回答和不,我不写几兆字节的文档字符串;)
【解决方案2】:

是的,文档字符串是从文件中读取的,但这不应阻止您编写它们。永远不要永远为了性能而牺牲代码的可读性,直到您完成性能测试并发现您担心的事情实际上是您的程序中导致问题的瓶颈。我认为文档字符串在任何实际情况下都不太可能对性能产生任何可衡量的影响。

【讨论】:

    【解决方案3】:

    默认情况下,文档字符串存在于.pyc 字节码文件中,并从它们加载(cmets 不存在)。如果您使用 python -OO(-OO 标志代表“强烈优化”,而不是 -O 代表“温和优化),您将获得并使用 .pyo 文件而不是 .pyc 文件,以及通过省略文档字符串进行优化(除了-O 所做的优化,它删除了assert 语句)。例如,考虑一个文件foo.py,它具有:

    """This is the documentation for my module foo."""
    
    def bar(x):
      """This is the documentation for my function foo.bar."""
      return x + 1
    

    你可以有以下shell会话...:

    $ python -c'import foo; print foo.bar(22); print foo.__doc__'
    23
    This is the documentation for my module foo.
    $ ls -l foo.pyc
    -rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyc
    $ python -O -c'import foo; print foo.bar(22); print foo.__doc__'
    23
    This is the documentation for my module foo.
    $ ls -l foo.pyo
    -rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
    $ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
    23
    This is the documentation for my module foo.
    $ ls -l foo.pyo
    -rw-r--r--  1 aleax  eng  327 Dec 30 16:17 foo.pyo
    $ rm foo.pyo
    $ python -OO -c'import foo; print foo.bar(22); print foo.__doc__'
    23
    None
    $ ls -l foo.pyo
    -rw-r--r--  1 aleax  eng  204 Dec 30 16:17 foo.pyo
    

    请注意,由于我们首先使用了-O,所以.pyo 文件是327 字节——即使在使用-OO 之后,因为.pyo 文件仍然存在并且Python 没有重建/覆盖它,它只是使用了现有的。删除现有的.pyo(或等价的touch foo.py,以便Python 知道.pyo 已“过时”)意味着Python 会重新构建它(在这种情况下,会在磁盘上节省123 个字节,以及一点当模块被导入时会更多——但所有 .__doc__ 条目都会消失并被 None 替换。

    【讨论】:

    • 顺便说一下,不是文档字符串的独立字符串(不在函数、类或模块的顶部)在任何优化级别都会生成no code。它们不在 .pyc 或 .pyo 文件中。它们是真正的多行 cmets。
    【解决方案4】:

    Python 文档字符串和 cmets 是 当模块存储在内存中 加载了吗?

    Docstrings 被编译成 .pyc 文件,并被加载到内存中。注释在编译过程中被丢弃,除了在编译过程中忽略它们所花费的微不足道的额外时间(仅在对 .py 文件进行任何更改后发生一次,除了每次重新编译的主脚本之外)运行)。

    还请注意,这些字符串仅在它们是模块、类定义或函数定义中的 first 事物时才会保留。您几乎可以在任何地方包含额外的字符串,但它们会在编译过程中像 cmets 一样被丢弃。

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2019-04-25
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多