2013-12-11 70 views
0

請原諒這個天真的問題。我試圖監視我的Python代碼的內存使用情況,並遇到了有前途的memory_profiler軟件包。我有一個關於解釋@profile裝飾器生成的輸出的問題。解釋python的輸出memory_profiler

下面是一個示例輸出,我得到通過運行下面我啞代碼:

dummy.py

from memory_profiler import profile 

@profile 
def my_func(): 
    a = [1] * (10 ** 6) 
    b = [2] * (2 * 10 ** 7) 
    del b 
    return a 

if __name__ == '__main__': 
    my_func() 

通過「蟒蛇dummy.py」呼叫dummy.py返回見下表。

線#內存使用增量行內容

3  8.2 MiB  0.0 MiB @profile 
4        def my_func(): 
5  15.8 MiB  7.6 MiB  a = [1] * (10 ** 6) 
6 168.4 MiB 152.6 MiB  b = [2] * (2 * 10 ** 7) 
7  15.8 MiB -152.6 MiB  del b 
8  15.8 MiB  0.0 MiB  return a 

我的問題是什麼呢8.2 MIB在表格的第一行對應。我的猜測是,這是python解釋器本身的初始內存使用情況;但我不確定。如果是這樣的話,有沒有辦法從腳本的內存使用量中自動減去這個基線使用量?

非常感謝您的時間和考慮!

Noushin

+0

未來,當詢問第三方模塊(尤其是NumPy之類的知名品牌)時,請提供鏈接。這次我爲你添加了它。 – abarnert

+0

謝謝!請記住這一點:)現在你提到了NumPy,我可以大膽地問你另一個問題嗎?你知道memory_profiler在使用NumPy數組的情況下是否返回準確的數字嗎? (在發現數組的內置「nbytes」模塊之前,我得到了sys.getsizeof調用的腥意,只是想知道我是否應該在這裏期待類似的問題) – user1146372

+0

我不知道。但大概是從操作系統或堆統計或類似的東西獲取內存使用情況的統計信息,而不是步行Python分配器。如果是這樣,即使你無法確定誰在使用它,任何正在使用的內存都將被計數。所以,我會給出10:1的賠率或更好的結果,至少在單線程程序中,您無需擔心。但是,真的,你最好問作者。 – abarnert

回答

0

根據the docs

第一列表示具有配置文件的代碼的行號,第二列(MEM的使用),該行之後Python解釋的內存使用情況已被執行。第三列(增量)表示當前行相對於最後一行的內存差異。

因此,8.2 MiB是第一行執行後的內存使用情況。這包括啓動Python所需的內存,加載腳本及其所有導入(包括memory_profiler本身)等等。

似乎沒有任何記錄的選項可以從每個條目中刪除該選項。但後處理結果並不難。

另外,你真的需要這樣做嗎?第三列顯示每行之後已經使用了多少附加內存,並且或者說,或者跨越一系列行的總和,似乎比每行的第二列和起始之間的差異更有趣。

0

線之間在存儲器中的差別在第二列中給出或者可以編寫一個小的腳本處理輸出。