python控制內(nèi)存的方法:
創(chuàng)新互聯(lián)長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為貴定企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,貴定網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
一、對(duì)象的引用計(jì)數(shù)機(jī)制
二、垃圾回收機(jī)制
三、內(nèi)存池機(jī)制
一、對(duì)象的引用計(jì)數(shù)機(jī)制
Python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,所有對(duì)象都有引用計(jì)數(shù)。
引用計(jì)數(shù)增加的情況:
1、一個(gè)對(duì)象分配一個(gè)新名稱
2、將其放入一個(gè)容器中(如列表、元組或字典)
引用計(jì)數(shù)減少的情況:
1、使用del語(yǔ)句對(duì)對(duì)象別名顯示的銷毀
2、引用超出作用域或被重新賦值 sys.getrefcount( )函數(shù)可以獲得對(duì)象的當(dāng)前引用計(jì)數(shù)
多數(shù)情況下,引用計(jì)數(shù)比你猜測(cè)得要大得多。對(duì)于不可變數(shù)據(jù)(如數(shù)字和字符串),解釋器會(huì)在程序的不同部分共享內(nèi)存,以便節(jié)約內(nèi)存。
二、垃圾回收
1、當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)歸零時(shí),它將被垃圾收集機(jī)制處理掉。
2、當(dāng)兩個(gè)對(duì)象a和b相互引用時(shí),del語(yǔ)句可以減少a和b的引用計(jì)數(shù),并銷毀用于引用底層對(duì)象的名稱。然而由于每個(gè)對(duì)象都包含一個(gè)對(duì)其他對(duì)象的應(yīng)用,因此引用計(jì)數(shù)不會(huì)歸零,對(duì)象也不會(huì)銷毀。(從而導(dǎo)致內(nèi)存泄露)。為解決這一問(wèn)題,解釋器會(huì)定期執(zhí)行一個(gè)循環(huán)檢測(cè)器,搜索不可訪問(wèn)對(duì)象的循環(huán)并刪除它們。
三、內(nèi)存池機(jī)制
Python提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
1、Pymalloc機(jī)制。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
2、Python中所有小于256個(gè)字節(jié)的對(duì)象都使用pymalloc實(shí)現(xiàn)的分配器,而大的對(duì)象則使用系統(tǒng)的malloc。
3、對(duì)于Python對(duì)象,如整數(shù),浮點(diǎn)數(shù)和List,都有其獨(dú)立的私有內(nèi)存池,對(duì)象間不共享他們的內(nèi)存池。也就是說(shuō)如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
更多Python知識(shí)請(qǐng)關(guān)注Python視頻教程欄目。
Python的內(nèi)存管理主要有三種機(jī)制:引用計(jì)數(shù)機(jī)制,垃圾回收機(jī)制和內(nèi)存池機(jī)制。
引用計(jì)數(shù)機(jī)制
簡(jiǎn)介
python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,Python內(nèi)部記錄了對(duì)象有多少個(gè)引用,即引用計(jì)數(shù),當(dāng)對(duì)象被創(chuàng)建時(shí)就創(chuàng)建了一個(gè)引用計(jì)數(shù),當(dāng)對(duì)象不再需要時(shí),這個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),它被垃圾回收。
特性
1.當(dāng)給一個(gè)對(duì)象分配一個(gè)新名稱或者將一個(gè)對(duì)象放入一個(gè)容器(列表、元組或字典)時(shí),該對(duì)象的引用計(jì)數(shù)都會(huì)增加。
2.當(dāng)使用del對(duì)對(duì)象顯示銷毀或者引用超出作用于或者被重新賦值時(shí),該對(duì)象的引用計(jì)數(shù)就會(huì)減少。
3.可以使用sys.getrefcount()函數(shù)來(lái)獲取對(duì)象的當(dāng)前引用計(jì)數(shù)。多數(shù)情況下,引用計(jì)數(shù)要比我們猜測(cè)的大的多。對(duì)于不可變數(shù)據(jù)(數(shù)字和字符串),解釋器會(huì)在程序的不同部分共享內(nèi)存,以便節(jié)約內(nèi)存。
垃圾回收機(jī)制
特性
1.當(dāng)內(nèi)存中有不再使用的部分時(shí),垃圾收集器就會(huì)把他們清理掉。它會(huì)去檢查那些引用計(jì)數(shù)為0的對(duì)象,然后清除其在內(nèi)存的空間。當(dāng)然除了引用計(jì)數(shù)為0的會(huì)被清除,還有一種情況也會(huì)被垃圾收集器清掉:當(dāng)兩個(gè)對(duì)象相互引用時(shí),他們本身其他的引用已經(jīng)為0了。
2.垃圾回收機(jī)制還有一個(gè)循環(huán)垃圾回收器, 確保釋放循環(huán)引用對(duì)象(a引用b, b引用a, 導(dǎo)致其引用計(jì)數(shù)永遠(yuǎn)不為0)。
內(nèi)存池機(jī)制
簡(jiǎn)介
在Python中,許多時(shí)候申請(qǐng)的內(nèi)存都是小塊的內(nèi)存,這些小塊內(nèi)存在申請(qǐng)后,很快又會(huì)被釋放,由于這些內(nèi)存的申請(qǐng)并不是為了創(chuàng)建對(duì)象,所以并沒(méi)有對(duì)象一級(jí)的內(nèi)存池機(jī)制。這就意味著Python在運(yùn)行期間會(huì)大量地執(zhí)行malloc和free的操作,頻繁地在用戶態(tài)和核心態(tài)之間進(jìn)行切換,這將嚴(yán)重影響Python的執(zhí)行效率。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
內(nèi)存池概念
內(nèi)存池的概念就是預(yù)先在內(nèi)存中申請(qǐng)一定數(shù)量的,大小相等的內(nèi)存塊留作備用,當(dāng)有新的內(nèi)存需求時(shí),就先從內(nèi)存池中分配內(nèi)存給這個(gè)需求,不夠了之后再申請(qǐng)新的內(nèi)存。這樣做最顯著的優(yōu)勢(shì)就是能夠減少內(nèi)存碎片,提升效率。內(nèi)存池的實(shí)現(xiàn)方式有很多,性能和適用范圍也不一樣。
特性
1.Python提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
2.Pymalloc機(jī)制。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
3.Python中所有小于256個(gè)字節(jié)的對(duì)象都使用pymalloc實(shí)現(xiàn)的分配器,而大的對(duì)象則使用系統(tǒng)的 malloc。
4.對(duì)于Python對(duì)象,如整數(shù),浮點(diǎn)數(shù)和List,都有其獨(dú)立的私有內(nèi)存池,對(duì)象間不共享他們的內(nèi)存池。也就是說(shuō)如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
用psutil包
cpu:
import?psutil
psutil.cpu_times()
scputimes(user=3961.46,?nice=169.729,?system=2150.659,?idle=16900.540,?iowait=629.59,?irq=0.0,?softirq=19.42,?steal=0.0,?guest=0,?nice=0.0)
for?x?in?range(3):
...?????psutil.cpu_percent(interval=1)
...
4.0
5.9
3.8
for?x?in?range(3):
...?????psutil.cpu_percent(interval=1,?percpu=True)
...
[4.0,?6.9,?3.7,?9.2]
[7.0,?8.5,?2.4,?2.1]
[1.2,?9.0,?9.9,?7.2]
for?x?in?range(3):
...?????psutil.cpu_times_percent(interval=1,?percpu=False)
...
scputimes(user=1.5,?nice=0.0,?system=0.5,?idle=96.5,?iowait=1.5,?irq=0.0,?softirq=0.0,?steal=0.0,?guest=0.0,?guest_nice=0.0)
scputimes(user=1.0,?nice=0.0,?system=0.0,?idle=99.0,?iowait=0.0,?irq=0.0,?softirq=0.0,?steal=0.0,?guest=0.0,?guest_nice=0.0)
scputimes(user=2.0,?nice=0.0,?system=0.0,?idle=98.0,?iowait=0.0,?irq=0.0,?softirq=0.0,?steal=0.0,?guest=0.0,?guest_nice=0.0)
psutil.cpu_count()
4
psutil.cpu_count(logical=False)
2
內(nèi)存:
psutil.virtual_memory()
svmem(total=8374149120L,?available=2081050624L,?percent=75.1,?used=8074080256L,?free=300068864L,?active=3294920704,?inactive=1361616896,?buffers=529895424L,?cached=1251086336)
psutil.swap_memory()
sswap(total=2097147904L,?used=296128512L,?free=1801019392L,?percent=14.1,?sin=304193536,?sout=677842944)
在python中可以用id()函數(shù)獲取對(duì)象的內(nèi)存地址。
#例如:
object = 1 + 2
print(id(object)) #4304947776
分享題目:python獲取函數(shù)內(nèi)存 python基于值的內(nèi)存管理
網(wǎng)址分享:http://jinyejixie.com/article42/hejihc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、App設(shè)計(jì)、網(wǎng)站排名、標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容