現(xiàn)在,100X的內存有可能被毫無用處地困在你的程序里,永遠不會被再次利用,而且也拒絕被系統(tǒng)分配給其他程序。更具諷刺意味的是,如果你使用處理模塊來運行程序的多個實例,那么就會嚴重限制你在給定計算機上可以運行的實例數。
內存剖析
想要衡量和測量程序的實際內存使用情況,可以使用memory_profiler模塊。我嘗試了一下,不確定所得出的結果是否可信。它使用起來非常簡單。你裝飾一個函數(可能是@profiler裝飾器的主函數0函數),當程序退出時,內存分析器會打印出一份標準輸出的簡潔報告,顯示每行的總內存和內存變化。
memory_profiler
https://pypi.python.org/pypi/memory_profiler
```python from memory_profiler import profile
@profile def main(): a = [] b = [] c = [] for i in range(100000): a.append(5) for i in range(100000): b.append(300) for i in range(100000): c.append('1234567890123
45678901234567890') del a del b del c
print ‘Done!’ if __name__ == '__main__':
main() ```
Here is the output:
Line # Mem usage Increment Line Contents
================================================
3 22.9 MiB 0.0 MiB @profile
4 def main():
如你所見,這里的內存開銷是22.9MB。在【-5,256】范圍內外添加整數和添加字符串時內存不增加的原因是在所有情況下都使用單個對象。目前尚不清楚為什么第8行的第一個range(1000)循環(huán)增加了4.2MB,而第10行的第二個循環(huán)只增加了0.4MB,第12行的第三個循環(huán)增加了0.8MB。最后,當刪除a、b和c列表時,為a和c釋放了0.6MB,但是為b添加了0.2MB。對于這些結果我并不是特別理解。
總結
Python為它的對象使用了大量內存,也使用了各種技巧和優(yōu)化方式來進行內存管理。通過跟蹤對象的內存使用情況并了解內存管理模型,可以顯著減少程序的內存占用。
學習Python,無論你是剛入門的新手還是經驗豐富的編碼人員,都可以使用我們的完整Python教程指南來學習。