2009-12-30 101 views
9

加載模塊時是否將Python文檔和註釋存儲在內存中?模塊加載時Python文檔和註釋是否存儲在內存中?

我想知道如果這是真的,因爲我通常記錄我的代碼;可能會影響內存使用情況?

通常每個Python對象都有一個__doc__方法。那些文檔是從文件中讀取,還是以其他方式處理?

我已經在論壇,Google和郵件列表中完成了搜索,但是我還沒有找到任何相關信息。

你知道嗎?

+4

只是爲了澄清,docstrings不是評論。它們是相似的,並且用於類似的目的,但是文檔字符串實際上是函數/對象的屬性,但我不認爲除了實際讀取.py文件本身之外,其他任何方式都可以訪問這些註釋。 – MatrixFrog 2009-12-31 00:00:17

+0

有多少內存會擔心可能會使用?每個字符多於1個字節?你在編程Timex Sinclair 1000嗎? – 2009-12-31 00:40:02

回答

22

默認情況下,docstrings存在於.pyc字節碼文件中,並從它們加載(註釋不是)。如果您使用python -OO-OO標誌代表「優化強烈」,而-O代表「優化適度」),您將獲得並使用.pyo文件而不是.pyc文件,並且這些文件通過省略文檔字符串進行了優化(除了通過-O做了優化,其中刪除assert語句)例如,假定有一個文件foo.py

"""This is the documentation for my module foo.""" 

def bar(x): 
    """This is the documentation for my function foo.bar.""" 
    return x + 1 

你可以有以下shell會話...:

$ python -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyc 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyc 
$ python -O -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyo 
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyo 
$ rm foo.pyo 
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
None 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 204 Dec 30 16:17 foo.pyo 

請注意,由於我們首先使用了-O,因此.pyo文件即使在使用-OO之後也是327字節,因爲.pyo文件仍在,並且Python沒有重建/覆蓋它,它只是使用現有文件。刪除現有的.pyo(或者等同於touch foo.py,以便Python知道.pyo「過時」)意味着Python重新構建它(並且在這種情況下,在磁盤上保存123個字節,並且在模塊導入時多一點點 - 但所有.__doc__條目消失並被替換爲None)。

+0

現在很明顯。非常好的答案。 – 2009-12-31 01:35:39

+0

順便提一下,單機字符串不是文檔字符串(未在函數,類,或模塊的頂部)產生[無代碼(https://twitter.com/gvanrossum/status/112670605505077248)在任何優化級別。它們不在.pyc或.pyo文件中。他們是真正的**多行評論**。 – 2017-04-08 11:31:07

4

他們從文件(當文件被編譯到PYC或加載PYC的時候 - 他們必須object.__doc__下可用)得到讀取,但沒有 - >這不會顯著影響性能在任何合理的情況下,還是你真的在寫幾兆字節的文檔字符串?

+0

+1良好和幽默的答案和**沒有**,我*不寫*多兆字節文檔字符串;) – 2009-12-31 00:05:34

7

是從文件中讀取文檔字符串,但不應該阻止您編寫它們。永遠不要妥協性能的代碼的可讀性,直到你做了性能測試,發現你擔心的事實上是你的程序中的瓶頸造成了問題。我認爲,在任何現實世界的情況下,文檔字符串都不會對性能造成任何可衡量的影響是極不可能的。

1

當模塊被加載時,Python文檔和註釋是 存儲在內存中嗎?

Docstrings被編譯到.pyc文件中,並被加載到內存中。註釋在編譯過程中被丟棄,除了在編譯過程中忽略它們所花費的額外時間(除非每次重新編譯主腳本時重新編譯一次.py文件之後纔會發生一次)跑)。

另請注意,這些字符串僅在模塊,類定義或函數定義中的第一個事件被保留。你可以在任何地方包含額外的字符串,但是在編譯過程中它們將被丟棄,就像註釋一樣。

相關問題