加載模塊時是否將Python文檔和註釋存儲在內存中?模塊加載時Python文檔和註釋是否存儲在內存中?
我想知道如果這是真的,因爲我通常記錄我的代碼;可能會影響內存使用情況?
通常每個Python對象都有一個__doc__
方法。那些文檔是從文件中讀取,還是以其他方式處理?
我已經在論壇,Google和郵件列表中完成了搜索,但是我還沒有找到任何相關信息。
你知道嗎?
加載模塊時是否將Python文檔和註釋存儲在內存中?模塊加載時Python文檔和註釋是否存儲在內存中?
我想知道如果這是真的,因爲我通常記錄我的代碼;可能會影響內存使用情況?
通常每個Python對象都有一個__doc__
方法。那些文檔是從文件中讀取,還是以其他方式處理?
我已經在論壇,Google和郵件列表中完成了搜索,但是我還沒有找到任何相關信息。
你知道嗎?
默認情況下,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
)。
現在很明顯。非常好的答案。 – 2009-12-31 01:35:39
順便提一下,單機字符串不是文檔字符串(未在函數,類,或模塊的頂部)產生[無代碼(https://twitter.com/gvanrossum/status/112670605505077248)在任何優化級別。它們不在.pyc或.pyo文件中。他們是真正的**多行評論**。 – 2017-04-08 11:31:07
他們是從文件(當文件被編譯到PYC或加載PYC的時候 - 他們必須object.__doc__
下可用)得到讀取,但沒有 - >這不會顯著影響性能在任何合理的情況下,還是你真的在寫幾兆字節的文檔字符串?
+1良好和幽默的答案和**沒有**,我*不寫*多兆字節文檔字符串;) – 2009-12-31 00:05:34
是從文件中讀取文檔字符串,但不應該阻止您編寫它們。永遠不要妥協性能的代碼的可讀性,直到你做了性能測試,發現你擔心的事實上是你的程序中的瓶頸造成了問題。我認爲,在任何現實世界的情況下,文檔字符串都不會對性能造成任何可衡量的影響是極不可能的。
當模塊被加載時,Python文檔和註釋是 存儲在內存中嗎?
Docstrings被編譯到.pyc文件中,並被加載到內存中。註釋在編譯過程中被丟棄,除了在編譯過程中忽略它們所花費的額外時間(除非每次重新編譯主腳本時重新編譯一次.py文件之後纔會發生一次)跑)。
另請注意,這些字符串僅在模塊,類定義或函數定義中的第一個事件被保留。你可以在任何地方包含額外的字符串,但是在編譯過程中它們將被丟棄,就像註釋一樣。
只是爲了澄清,docstrings不是評論。它們是相似的,並且用於類似的目的,但是文檔字符串實際上是函數/對象的屬性,但我不認爲除了實際讀取.py文件本身之外,其他任何方式都可以訪問這些註釋。 – MatrixFrog 2009-12-31 00:00:17
有多少內存會擔心可能會使用?每個字符多於1個字節?你在編程Timex Sinclair 1000嗎? – 2009-12-31 00:40:02