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

时间:2017-06-06 12:21:44

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

我希望使用Jedi为我的Python代码添加一些自动完成支持。这可以通过使用函数docstrings或类型提示(或两者)来完成。

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。

2 个答案:

答案 0 :(得分:10)

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

对于Python和jedi,使用docstrings或函数注释时没有任何区别。性能和内存影响都不应该引人注目。在这两种情况下,显然都有很小的运行时开销。

文档字符串只是转换为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以及其他工具上进行,以使类型注释在验证程序时更有用。已使用类型注释,您将为未来做好准备。

答案 1 :(得分:1)

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

最后和FWIW:我已经在Emacs中使用Jedi已经有好几年了,从来没有出现性能问题所以我认为你不应该真的担心...