本文主要是詳細介紹Pyhon的代碼優化,以Pyhon的記數體制做為引進,詳細介紹Pyhon的代碼優化方法,感興趣的小伙伴來了解一下吧
什么是內存管理模式
python中建立的目標情況下,都會先進行申請基址,再對目標開展復位,全部目標都是會維護保養在同一個
個稱為refchain的雙重循環鏈表中,每一個數據儲存如下所示信息內容:
import sys a=[11,22]#對象被創建 b=a#對象被別的變量引用 c=[111,222,333,a]#對象被作為元素,放在容器中 #獲取對象的引用計數 print(sys.getrefcount(a))#對象被當成參數傳遞到函數中
1.單鏈表中數據前后左右數據庫的指示針
2.數據的類型
3.數據值
4.數據庫的引用計數
5.數據庫的長短(list,dict..)
import sys
del b#對象的別名被顯式的銷毀
b=999#對象的一個別名被賦值給其他對象
del c#列表被銷毀(容器被銷毀)
c.pop()#把列表數據最后一個刪除掉(對象從容器中被移除)
一、引用計數體制
引用計數提升:
1.1目標被建立
1.2目標被其他自變量引入(此外取了個名稱)
1.3目標被認為是原素,放到容器里(比如被當做原素放到頁面上)
1
1.4目標被當做傳遞數據到函數中
importsys a=[11,22]#目標被建立 b=a#目標被其他自變量引入 c=[111,222,333,a]#目標被認為是原素,放到容器里 #獲取對象的引用記數 print(sys.getrefcount(a))#目標被當做傳遞數據到函數中
最后的執行結果是,a這個自變量被引用了4次
引用計數減少:
目標別名被顯式的消毀
目標一個別名被賦值給其他目標(例:比如原來的a=10,被改成a=100,此時10的引用計數就減少了)
目標從容器里被移除,或者容器被消毀(例:目標從頁面上被移除,或者列表被消毀)
一個引入離開了它的作用域(調用函數的時候傳進去的參數,在函數運行結束后,該參數的引入即被消毀)
importsys
delb#目標別名被顯式的消毀
b=999#目標一個別名被賦值給其他目標
delc#列表被消毀(容器被消毀)
c.pop()#把列表數據最后一個刪除掉(目標從容器里被移除)
二、數據池和緩存文件
數據池分為兩種:小整數金額池和大整數金額池
小整數金額池(-5到256之間的信息)
運行機制:Python自動將-5~256的整數金額進行了緩存文件到一個小整數金額池中,當你將這些整數金額賦值給自變量時,并不會重新
創建對象,而是使用早已建立好的緩存文件目標,當刪除這些數據的引入時,也不會開展回收
超出-5到256的整數金額將無法在緩存文件,會再次創建對象
比如:
針對超出-5到256的整數金額將無法在緩存文件,Python會再次創建對象,回到id
#情景1:數據為列表,沒有在-5~256的范圍 >>>a=[11] >>>b=[11] >>>id(a),id(b) (1693226918600,1693231858248)========》id不同 #情景二:數據為整數金額,在-5~256的范圍 >>>aa=11 >>>bb=11 >>>id(aa),id(bb) (140720470385616,140720470385616)id同樣 #情景三:數據沒有在-5~256的范圍 >>>bb=-7 >>>aa=-7 >>>id(aa),id(bb) (1843518717904,1843518717776)id不同 #情景四:數據沒有在-5~256的范圍 >>>a=257 >>>b=257 >>>id(a),id(b) (2092420910928,2092420911056)id不同
大整數金額池(字符串數組停留池/intern機制)
優勢:在建立一個新的字符串對象時,首先會在緩存文件池里邊找是否存在早已存有的值同樣對象(標志符,即只包括數據、英文字母、下橫線的字符串數組),若是有,則立即拿出來用(引入),防止頻繁地建立和消毀運存,提升工作效率
比如:
針對沒有在標志符內的信息將無法在緩存文件,Python會再次創建對象,回到id
#情景1: >>>a='123adsf_' >>>b='123adsf_' >>>id(a),id(b) (61173296,61173296)========》id同樣 #情景二: >>>b1='123adsf_?' >>>b2='123adsf_?' >>>id(b1),id(b2) (61173376,61173416)id不同 #場景1:數據為列表,不在-5~256的范圍 >>>a=[11] >>>b=[11] >>>id(a),id(b) (1693226918600,1693231858248)========》id不一樣 #場景二:數據為整數,在-5~256的范圍 >>>aa=11 >>>bb=11 >>>id(aa),id(bb) (140720470385616,140720470385616)id一樣 #場景三:數據不在-5~256的范圍 >>>bb=-7 >>>aa=-7 >>>id(aa),id(bb) (1843518717904,1843518717776)id不一樣 #場景四:數據不在-5~256的范圍 >>>a=257 >>>b=257 >>>id(a),id(b) (2092420910928,2092420911056)id不一樣
緩存機制
針對python中常見內嵌基本數據類型的緩存文件:
float:緩存文件100個目標
list:80個目標
dict:80個目標
set:80個目標
#場景1: >>>a='123adsf_' >>>b='123adsf_' >>>id(a),id(b) (61173296,61173296)========》id一樣 #場景二: >>>b1='123adsf_?' >>>b2='123adsf_?' >>>id(b1),id(b2) (61173376,61173416)id不一樣 數組:會依據數組數據庫的長短,各自緩存文件數組長短為0-20對象
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128852.html
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:且本小白也親身經歷了整個從小白到爬蟲初入門的過程,因此就斗膽在上開一個欄目,以我的圖片爬蟲全實現過程為例,以期用更簡單清晰詳盡的方式來幫助更多小白應對更大多數的爬蟲實際問題。 前言: 一個月前,博主在學過python(一年前)、會一點網絡(能按F12)的情況下,憑著熱血和興趣,開始了pyth...
摘要:至于怎樣下載付費網易云音樂,還是開個會員吧,要知道免費是最貴的的這個道理。代碼寫完了,那還等什么,運行一下裝逼啊這下好了,裝逼失敗,被網易云認出來我是爬蟲的,那我試試加下請求頭結果加了還是一個樣,這個也算是個巨坑吧。 前兩天教了大家如何在控制臺上找到真實的mp3播放地址,但是不可以下載付費的,因為只能下載可播放的歌曲。至于怎樣下載付費網易云音樂,還是開個會員吧,要知道免費是最貴的的這個...
摘要:兩數之和暴力求解首先我們需要有一個目標列表,并且有一個目標值。如果列表中的某兩個數之和,正好等于我們的目標值,那么就會反回那兩個數的索引。 兩數之和----------暴力求解 首先我們需要有一個目標列表,并且有一個目標值。如果列表中的某兩個數之和,正好等于我們的目標值,那么就會反回那兩個數...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02