現(xiàn)在,100X的內(nèi)存有可能被毫無(wú)用處地困在你的程序里,永遠(yuǎn)不會(huì)被再次利用,而且也拒絕被系統(tǒng)分配給其他程序。更具諷刺意味的是,如果你使用處理模塊來(lái)運(yùn)行程序的多個(gè)實(shí)例,那么就會(huì)嚴(yán)重限制你在給定計(jì)算機(jī)上可以運(yùn)行的實(shí)例數(shù)。
內(nèi)存剖析
想要衡量和測(cè)量程序的實(shí)際內(nèi)存使用情況,可以使用memory_profiler模塊。我嘗試了一下,不確定所得出的結(jié)果是否可信。它使用起來(lái)非常簡(jiǎn)單。你裝飾一個(gè)函數(shù)(可能是@profiler裝飾器的主函數(shù)0函數(shù)),當(dāng)程序退出時(shí),內(nèi)存分析器會(huì)打印出一份標(biāo)準(zhǔn)輸出的簡(jiǎn)潔報(bào)告,顯示每行的總內(nèi)存和內(nèi)存變化。
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():
如你所見(jiàn),這里的內(nèi)存開(kāi)銷(xiāo)是22.9MB。在【-5,256】范圍內(nèi)外添加整數(shù)和添加字符串時(shí)內(nèi)存不增加的原因是在所有情況下都使用單個(gè)對(duì)象。目前尚不清楚為什么第8行的第一個(gè)range(1000)循環(huán)增加了4.2MB,而第10行的第二個(gè)循環(huán)只增加了0.4MB,第12行的第三個(gè)循環(huán)增加了0.8MB。最后,當(dāng)刪除a、b和c列表時(shí),為a和c釋放了0.6MB,但是為b添加了0.2MB。對(duì)于這些結(jié)果我并不是特別理解。
總結(jié)
Python為它的對(duì)象使用了大量?jī)?nèi)存,也使用了各種技巧和優(yōu)化方式來(lái)進(jìn)行內(nèi)存管理。通過(guò)跟蹤對(duì)象的內(nèi)存使用情況并了解內(nèi)存管理模型,可以顯著減少程序的內(nèi)存占用。
學(xué)習(xí)Python,無(wú)論你是剛?cè)腴T(mén)的新手還是經(jīng)驗(yàn)豐富的編碼人員,都可以使用我們的完整Python教程指南來(lái)學(xué)習(xí)。