web-dev-qa-db-ja.com

どちらがより効率的ですか:Python docstringsまたはtype-hints?

オートコンプリートのサポートをPython code with Jedi に追加したい。これは、関数docstringまたはタイプヒント(あるいはその両方)を使用して実行できます。

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の効率に興味があります。

16
planetp

TL; DR:型注釈を使用してください。すばらしいです。

Pythonとjediの両方で、docstringまたは関数アノテーションを使用しても違いはありません。パフォーマンスとメモリの両方への影響は目立たないはずです。明らかに実行時のオーバーヘッドはわずかです。両方の場合において。

Docstringは単純にPython文字列に変換され、属性_function.__doc___に格納されます。これには数バイトのメモリが必要ですが、気にする必要はありません。1000の非常に大きなdocstring文字はまだ1kBのRAMしか使用しません。メモリに制約がある場合は、_python -o_を使用してdocstringを削除できます(また、アサートも検索してください)。

型注釈(PEP 484、例:def foo(a: int) -> str:)は_function.__annotations___に格納されます:

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

これらの注釈も明らかにある程度のスペースを使用します(ただし、docstringよりも少なくなります)。ただし、実行時の実行には影響しません(___annotations___で明示的に操作する場合を除く)。

型注釈を使用することをお勧めします。それらは静的分析/ IDEのために導入されており、タイプの文書化に関しては間違いなく未来です。 mypyjediやその他のツールで、プログラムの検証で型アノテーションをより使いやすくするための多くの作業も行われています。すでに型注釈を使用しておけば、将来に備えることができます。

14
Dave Halter

適切な答えではありませんが、オートコンプリート部分だけの場合、docstringもタイプヒントも必要ありません。また、非常に非常にveryとにかく、stdlibおよび3番目の部分のパッケージに「タイプヒント」コードがほとんどないことに注意してください。

最後に、FWIW:私はEmacsでJediをかなりの数年間使用していて、パフォーマンスの問題が発生したことは一度もないので、本当に心配する必要はないと思います...

1