2017-06-06 11 views
3

我想添加一些支持自動完成到我的Python代碼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。

回答

3

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

不是一個正確的答案,但是對於自動完成部分來說,既不需要文檔字符串也不需要類型提示。另外請注意,無論如何,stdlib和3rd部分包中都會提供很少的「type-hinted」代碼。

最後和FWIW:我一直在使用的絕地在Emacs了好幾年了,從來沒有過的性能問題,所以我不認爲你應該真正擔心......

+0

從我的經驗來看,大多數情況下,Jedi只會在添加類型提示或合適的文檔字符串後纔開始自動完成。無論如何,問題不僅僅是Jedi的效率,還有Python代碼本身:) – planetp

+1

「這個問題不僅是關於Jedi的效率,還有Python代碼」=>那麼你可能想澄清你的問題。但無論如何:docstrings沒有明顯的影響AFAICT。不能告訴類型提示,但它們也不應該有太大的影響。 –

相關問題