2010-08-06 41 views
5

我正在嘗試改變繪圖代碼(matplotlib)的基本結構,該繪圖在計時器上更新,以便將繪圖數據的Python列表轉換爲使用numpy數組。我希望能夠儘可能地降低劇情的時間步長,並且由於數據可能會達到數千個點,如果我不能,我會開始快速地失去寶貴的時間。我知道numpy數組對於這類事情是首選,但是當我需要像Python程序員一樣思考時,以及當我需要像C++程序員那樣思考時,我很難找出最大限度提高內存訪問效率的方法。如何使用numpy數組添加和刪除Pythonic垃圾回收?

它在scipy.org文檔中爲append()函數說明它返回數組的副本。所有這些副本是否都能正確地進行垃圾收集?例如:

import numpy as np 

a = np.arange(10) 
a = np.append(a,10) 
print a

這是我這是怎麼回事在C++的閱讀 - 的水平,但如果我知道我在說什麼,我就不會問這個問題,所以請糾正我,如果我錯了! = P

首先分配10個整數的塊,符號a指向該塊的開始。然後分配一個新的11個整數塊,總共使用21個整數(84個字節)。然後,一個指針被移動到11-int塊的開始處。我的猜測是,這將導致垃圾收集算法將10-int塊的引用計數遞減到零並解除分配。這是正確的嗎?如果不是,如何確保在追加時不會創建開銷?

我也不知道如何正確刪除一個numpy數組,當我完成使用它。我的地塊上有一個重置按鈕,只需刷新所有數據並重新開始。當我有名單時,這是使用del data[:]完成的。是否有一個numpy數組的等價函數?或者我應該只是說data = np.array([])並指望垃圾收集器爲我完成這項工作?

回答

10

自動內存管理的重點在於你沒有考慮它。在您編寫的代碼中,副本將被垃圾收集得很好(幾乎不可能混淆Python的內存管理)。但是,因爲np.append不在位,代碼將在內存中創建一個新陣列(包含a10的連接),然後變量a將更新爲指向此新陣列。由於a現在不再指向具有1的refcount的原始數組,其引用計數遞減到0,並且它將被自動清除。您可以使用gc.collect強制進行全面清理。

Python的優勢並不在於微調內存訪問,雖然它可以優化。您可能是最好的預先分配a(例如使用a = np.zeros(<size>));如果你需要更好的調節,那麼它開始變得有點多毛。您可以查看Cython + Numpy tutorial,以便將C與Python集成以提高效率。

Python中的變量只是指向其內容的存儲位置;你可以del任何變量,它會減少目標的引用計數1。目標將在其引用計數達到零後自動清除。這是道德的,不要擔心清理你的記憶。它會自動發生。

+0

所以基本上我需要冷靜。 =) 感謝您的澄清,我認爲這是如何工作,但我並沒有100%清楚。 – pr0crastin8r 2010-08-06 21:12:45