【问题标题】:Which is more efficient: Python docstrings or type-hints?哪个更有效:Python 文档字符串或类型提示?
【发布时间】:2017-06-06 12:21:44
【问题描述】:

我想使用 Jedi 为我的 Python 代码添加一些自动完成功能的支持。这可以通过使用函数文档字符串或类型提示(或两者)来完成。

def function_with_types_in_docstring(param1, param2):
    """Example function with types documented in the docstring.

    :type param1: int
    :type param2: str
    :rtype: bool
    """

def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
    """Example function with PEP 484 type annotations."""

哪种记录类型的方法在内存使用和运行时间方面增加的开销更少?我首先对 Python 代码本身的效率感兴趣,然后是 Jedi。

【问题讨论】:

    标签: python python-3.x type-hinting docstring python-jedi


    【解决方案1】:

    TL;DR:使用类型注释,它们很棒。

    对于 Python 和 jedi,无论您使用文档字符串还是函数注释,都没有区别。性能和内存影响都应该不明显。显然,这两种情况下的运行时开销都很小。

    文档字符串被简单地转换为 Python 字符串并存储在属性function.__doc__ 中。这需要几个字节的内存,但你不应该关心这一点。一个非常大的 1000 个字符的文档字符串仍然只使用 1kB 的 RAM。如果您的记忆力有限,您可以简单地使用python -o 来删除文档字符串(以及断言,查找它)。

    类型注释(PEP 484,例如def foo(a: int) -> str:)存储在function.__annotations__

    >>> def foo(bar: int): pass
    ... 
    >>> foo.__annotations__
    {'bar': <class 'int'>}
    

    这些注释显然也使用了一些空间(但甚至比文档字符串还要少)。但是它们对运行时执行没有影响(除非您明确使用__annotations__

    我建议您使用类型注释。由于静态分析/IDE,它们已经被引入,并且在记录类型时绝对是未来。在 mypyjedi 和其他工具上还有很多工作要做,以使类型注释在验证程序中更有用。已经使用类型注释,您将为未来做好准备。

    【讨论】:

    • "甚至比 docstrings 还要少":请注意,注释现在存储为字符串 (docs.python.org/3.7/whatsnew/…),因此节省的空间很小。这个改变实际上是因为注解使启动变慢了。
    • 虽然使用类型注释很有意义,但它并不能解决问题。由于 docstring 仍然可以描述参数的用途(用文字表示),我们需要两者:用于 linter 的类型注释和用于人类的 docstrings。我不知道有任何 PEP 建议如何合并两者,因此尊重 DRY,如果函数使用类型提示,我们可以在编写文档字符串时省略类型。
    • @masi 是的,您需要文档字符串,但类型不需要它们。有一种简单的方法可以生成使用注释的文档。
    【解决方案2】:

    不是一个正确的答案,但仅对于自动完成部分,既不需要文档字符串也不需要类型提示。另请注意,无论如何,您会在 stdlib 和第 3 部分包中发现非常非常非常 很少的“类型提示”代码。

    最后,FWIW:我已经在 Emacs 中使用 Jedi 好几年了,从来没有遇到过性能问题,所以我认为你不必担心......

    【讨论】:

    • 有趣。根据我的经验,大多数时候 Jedi 只会在我添加类型提示或适当的文档字符串后才开始自动完成。无论如何,问题不仅在于 Jedi 的效率,还在于 Python 代码本身:)
    • "这个问题不仅是关于 Jedi 的效率,还有 Python 代码" => 那么你可能想澄清你的问题。但无论如何:文档字符串对 AFAICT 没有明显影响。无法说出类型提示,但它们也不应该产生太大影响。
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2011-08-04
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多