Python 文档字符串和类型提示哪个更有效?

问题描述 投票:0回答:2

我想使用 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-typing docstring python-jedi
2个回答
28
投票

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,它们已经被引入,并且在记录类型方面绝对是未来。在

mypy
jedi
和其他工具上也做了很多工作,以使类型注释在验证程序时更有用。已经使用类型注释,您将为未来做好准备。


0
投票

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

最后,FWIW:我已经在 Emacs 中使用 Jedi 好几年了,从未遇到过性能问题,所以我认为你不应该真正担心......

© www.soinside.com 2019 - 2024. All rights reserved.