做python开发要用多大的内存_Python 在分配内存需要考虑的问题
由此能看出可變對象在擴充時的秘密:超額分配機制:申請新內(nèi)存時并不是按需分配的,而是多分配一些,因此當(dāng)再添加少量元素時,不需要馬上去申請新內(nèi)存
非均勻分配機制:三類對象申請新內(nèi)存的頻率是不同的,而同一類對象每次超額分配的內(nèi)存并不是均勻的,而是逐漸擴大的
3、列表不等于列表!
以上的可變對象在擴充時,有相似的分配機制,在動態(tài)擴容時可明顯看出效果。
那么,靜態(tài)創(chuàng)建的對象是否也有這樣的分配機制呢?它跟動態(tài)擴容比,是否有所區(qū)別呢?
先看看集合與字典:#靜態(tài)創(chuàng)建對象set_1={1,2,3,4}set_2={1,2,3,4,5}dict_1={'a':1,'b':2,'c':3,'d':4,'e':5}dict_2={'a':1,'b':2,'c':3,'d':4,'e':5,'f':6}sys.getsizeof(set_1)#224sys.getsizeof(set_2)#736sys.getsizeof(dict_1)#240sys.getsizeof(dict_2)#368
看到這個結(jié)果,再對比上一節(jié)的截圖,可以看出:在元素個數(shù)相等時,靜態(tài)創(chuàng)建的集合/字典所占的內(nèi)存跟動態(tài)擴容時完全一樣。
這個結(jié)論是否適用于列表對象呢?一起看看:list_1=['a','b']list_2=['a','b','c']list_3=['a','b','c','d']list_4=['a','b','c','d','e']sys.getsizeof(list_1)#80sys.getsizeof(list_2)#88sys.getsizeof(list_3)#96sys.getsizeof(list_4)#104
上一節(jié)的截圖顯示,列表在前4個元素時都占96字節(jié),在5個元素時占128字節(jié),與這里明顯矛盾。
所以,這個秘密昭然若揭:在元素個數(shù)相等時,靜態(tài)創(chuàng)建的列表所占的內(nèi)存有可能小于動態(tài)擴容時的內(nèi)存!
也就是說,這兩種列表看似相同,實際卻不同!列表不等于列表!
4、消減元素并不會釋放內(nèi)存!
前面提到了,擴充可變對象時,可能會申請新的內(nèi)存。
那么,如果反過來縮減可變對象,減掉一些元素后,新申請的內(nèi)存是否會自動回收掉呢?importsysa=[1,2,3,4]sys.getsizeof(a)#初始值:96a.append(5)#擴充后:[1,2,3,4,5]sys.getsizeof(a)#擴充后:128a.pop()#縮減后:[1,2,3,4]sys.getsizeof(a)#縮減后:128
如代碼所示,列表在一擴一縮后,雖然回到了原樣,但是所占用的內(nèi)存空間可沒有自動釋放啊。其它的可變對象同理。
這就是Python的小秘密了,“胖子無法減重原理”:瘦子變胖容易,縮減身型也容易,但是體重減不掉,哈哈~~~
5、空字典不等于空字典!
使用pop()方法,只會縮減可變對象中的元素,但并不會釋放已申請的內(nèi)存空間。
還有個clear()方法,它會清空可變對象的所有元素,讓我們試試看吧:importsysa=[1,2,3]b={1,2,3}c={'a':1,'b':2,'c':3}sys.getsizeof(a)#88sys.getsizeof(b)#224sys.getsizeof(c)#240a.clear()#清空后:[]b.clear()#清空后:set()c.clear()#清空后:{},也即dict()
調(diào)用clear()方法,我們就獲得了幾個空對象。
在第一小節(jié)里,它們的內(nèi)存大小已經(jīng)被查驗過了。(前面說過會考的,請默寫回看下)
但是,如果這時再查驗的話,你會驚訝地發(fā)現(xiàn),這些空對象的大小跟前面查的并不完全一樣!#承接前面的清空操作:sys.getsizeof(a)#64sys.getsizeof(b)#224sys.getsizeof(c)#72
空列表與空元組的大小不變,然而空字典(72)竟然比前面的空字典(240)要小很多!
也就是說,列表與元組在清空元素后,回到起點不變初心,然而,字典這家伙卻是“賠了夫人又折兵”,不僅把“吃”進去的全吐出來了,還把自己的老本給虧掉了!
字典的這個秘密藏得挺深的,說實話我也是剛剛獲知,百思不得其解……
以上就是Python在分配內(nèi)存時的幾個小秘密啦,看完之后,你是否覺得漲見識了呢?
你想明白了幾個呢,又產(chǎn)生了多少新的謎團呢?歡迎留言一起交流哦~
對于那些沒有充分解釋的小秘密,今后我們再慢慢揭秘……
編輯:hfy
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的做python开发要用多大的内存_Python 在分配内存需要考虑的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql主从同步报错_mysql主从同
- 下一篇: python deepcopy报错_py