Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪一个更有效:Python文档字符串还是类型提示?_Python_Python 3.x_Type Hinting_Docstring_Python Jedi - Fatal编程技术网

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

哪一个更有效:Python文档字符串还是类型提示?,python,python-3.x,type-hinting,docstring,python-jedi,Python,Python 3.x,Type Hinting,Docstring,Python Jedi,我想在我的Python代码中添加一些对自动完成的支持。这可以通过使用函数docstrings或类型提示(或两者)来实现 哪种记录类型的方法在内存使用和运行时间方面增加的开销更少?我首先对Python代码本身的效率感兴趣,然后是Jedi。这不是一个正确的答案,但仅对于自动完成部分,不需要docstring或类型提示。另外请注意,在stdlib和第三部分软件包中,您会发现很少有“类型提示”代码 最后和FWIW:我在Emacs中使用绝地已经有好几年了,从来没有出现过性能问题,所以我认为你不应该真的担心

我想在我的Python代码中添加一些对自动完成的支持。这可以通过使用函数docstrings或类型提示(或两者)来实现


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

这不是一个正确的答案,但仅对于自动完成部分,不需要docstring或类型提示。另外请注意,在stdlib和第三部分软件包中,您会发现很少有“类型提示”代码


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

TL;DR:使用类型注释,它们非常棒

对于Python和绝地来说,使用docstring或函数注释并没有什么区别。性能和内存影响都不应明显。显然,在这两种情况下,运行时开销都很小

docstring被简单地转换为Python字符串并存储在attribute
函数中。这需要几个字节的内存,但你不应该在意。1000个字符的非常大的docstring仍然只使用1kB的RAM。如果您的内存受到限制,您可以简单地使用
python-o
来摆脱docstring(以及断言,请查找它)

类型注释(PEP 484,例如
def foo(a:int)->str:
)存储在
函数中

>>> def foo(bar: int): pass
... 
>>> foo.__annotations__
{'bar': <class 'int'>}
def foo(条形图:int):通过 ... >>>foo.\uu注释__ {'bar':}
这些注释显然也使用了一些空间(但甚至比docstring更少)。但是,它们对运行时执行没有影响(除非您显式地使用
\uuuuu注释\uuuu


我建议您使用类型注释。由于静态分析/IDE的缘故,它们已经被引入,并且在记录您的类型时肯定是未来的趋势。在
mypy
jedi
和其他工具上也有很多工作要做,以使类型注释在验证程序时更可用。使用类型注释ns已经准备好了,你将为未来做好准备。

很有趣。根据我的经验,大多数情况下,在我添加类型提示或适当的docstring后,绝地武士才开始自动完成。无论如何,问题不仅在于绝地武士的效率,还在于Python代码本身:)“问题不仅是关于Jedi的效率,还有Python代码”=>那么你可能想澄清你的问题。但无论如何:DocString对AFAICT没有明显的影响。无法说明类型提示,但它们也不会有太大的影响。“甚至比DocString还要小”:注意注释现在存储为字符串(),因此节省的空间非常小。之所以进行此更改,实际上是因为注释使启动速度变慢。虽然使用类型注释是有意义的,但并不能解决问题。因为docstring仍然有意义描述参数的用途(用文字表示)我们两者都需要:linter的类型注释和human的docstring。我不知道有任何PEP建议如何合并这两种类型,因此我们尊重DRY,如果函数使用类型提示,我们可以在编写docstring时省略类型。@masi是的,您需要docstring,但类型不需要它们。有一种简单的方法可以生成使用annot的文档不公平。
>>> def foo(bar: int): pass
... 
>>> foo.__annotations__
{'bar': <class 'int'>}