日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Python小數據池和代碼塊緩存機制

瀏覽:37日期:2022-06-23 10:18:52
前言

本文除'總結'外,其余均為認識過程;3.7.5;這部分官方文檔不知道在哪里找,目前沒有找到,有誰知道的可以麻煩留言嗎? 謝謝了!

總結:

如果在同一代碼塊下,則采用同一代碼塊下的緩存機制;如果是不同代碼塊,則采用小數據池的駐留機制;需要注意的是,交互式輸入時,每個命令都是一個代碼塊;

實現 Intern 保留機制的方式非常簡單,就是通過維護一個字符串儲蓄池,這個池子是一個字典結構,編譯時,如果字符串已經存在于池子中就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對象,如果之前還沒有加入到該池子中,則先構造一個字符串對象,并把這個對象加入到池子中去,方便下一次獲取;

長度為0與1的字符串一定會被駐留;字符串駐留發(fā)生在程序編譯時;被駐留的字符串必須由 ASCll 字母, 數字以及下劃線組成;

1.代碼塊的緩存機制

Python 程序是由代碼塊構造的。塊是一個 Python 程序的文本,它是作為一個單元執(zhí)行的。代碼塊:一個模塊, 一個函數, 一個類, 一個文件等都是一個代碼塊;交互方式:在 cmd 中進入 Python 解釋器里面,輸入的每一條命令都是一個代碼塊;

Python 在執(zhí)行同一個代碼塊的初始化對象的命令時,會檢查其值是否存在,如果存在,會將其重用;滿足代碼塊的緩存機制則它們在內存中只存在一個,即:id相同;代碼塊的緩存機制的適用范圍: int(float),str,bool;

int(float): 任何數字在同一代碼塊下都會復用;bool: True 和 False 在字典中會以 1,0 方式存在,并且復用;str:同一代碼塊中,值相同的字符串在內存中只存在一個:

s1 = ’janes@!#*ewq’s2 = ’janes@!#*ewq’print(s1 is s2) # True a1 = ’janes45613256132!@#$%#^%@$%’ * 1b1 = ’janes45613256132!@#$%#^%@$%’ * 1print(a1 is b1) # Trues1 = ’hah_’ * 6s2 = ’hah_’ * 6print(s1 is s2) # True2.小數據池

Python 自動將 -5~256 的整數進行了緩存,當你將這些整數賦值給變量時,并不會重新創(chuàng)建對象,而是使用已經創(chuàng)建好的緩存對象;Python會將滿足一定規(guī)則的字符串在字符串駐留池中,創(chuàng)建一份,當你將這些字符串賦值給變量時,并不會重新創(chuàng)建對象, 而是使用在字符串駐留池中創(chuàng)建好的對象;bool 值就是 True,False,無論你創(chuàng)建多少個變量指向 True,False,它在內存中都只存在一個;

小數據池也是只針對 int(float),str,bool;小數據池是針對不同代碼塊之間的緩存機制;

# cmd, -5~256 的小整數雖然不在同一代碼塊中, 但是它們適用小數據池機制>>>a = 245>>>b = 245>>>a is b # True

# 長度為0與1的字符串一定會被駐留;# 字符串駐留發(fā)生在程序編譯時;# 被駐留的字符串必須由 ASCll字母, 數字以及下劃線組成;>>>s1 = ’@’>>>s2 = ’@’>>>s1 is s2 # True>>>s1 = ’’>>>s2 = ’’>>>s1 is s2 # True>>>s1 = ’a_b_c’>>>s2 = ’a_b_c’>>>s1 is s2 # True>>>s1 = ’a b_c’>>>s2 = ’a b_c’>>>s1 is s2 # False>>>s1 = ’a_b_c’ * 1>>>s2 = ’a_b_c’ * 1>>>s1 is s2 # True>>>s1 = ’abd_d23’ * 3>>>s2 = ’abd_d23’ * 3>>>s1 is s2 # True>>>a, b = 'some_thing!', 'some_thing!'>>>a is b # False>>>a, b = 'some_thing', 'some_thing'>>>a is b # True

a1 = 1000b1 = 1000a1 is b1 # Trueclass C1(object): a = 100 b = 100 c = 1000 d = 1000 class C2(object): a = 100 b = 1000print(C1.a is C1.b) # Trueprint(C1.a is C2.a) # Trueprint(C1.c is C1.d) # Trueprint(C1.c is C2.b) # False3.優(yōu)缺點

優(yōu)點:值相同的字符串的(比如標識符),直接從池里拿來用,避免頻繁的創(chuàng)建和銷毀,提升效率,節(jié)約內存;

缺點:拼接字符串、對字符串修改之類的影響性能;因為是不可變的,所以對字符串修改不是 inplace 就地操作,要新建對象,這也是為什么拼接多字符串的時候不建議用 + 而用 join();join() 是先計算出所有字符串的長度,然后一一拷貝,只 new 一次對象;

小整數對象池

為避免整數頻繁申請和銷毀內存空間,python 使用了小整數對象池,Python 對小整數的定義是 [-5, 256] ,這些整數對象是提前建立好的,不會被垃圾回收;一個 Python 程序中,無論這個整數處于 LEGB 中哪個位置,所有位于這個范圍內的整數使用的都是同一個對象;

# 3.7.5, ipython7.18.1a = -5b = -5a is b # Truea = -6b = -6a is b # Falsea = 256b = 256a is b # Truea = 257b = 257a is b # Flase大整數對象池

cmd 終端中,大整數每賦值一次,每次的大整數都會重新創(chuàng)建,Pycharm 中,每次運行時,所有代碼都加載到內存中,屬于一個整體,所以這個時候會有一個大整數對象池處于一個代碼塊的大整數是同一個對象;c 和 d 處于一個代碼塊,而 C1.b 和 C2.b 分別有自己的代碼塊,所以不相等;

# cmd 終端a = 1000b = 1000a is b # False--------------------class C1(object): a = 100 b = 100 c = 1000 d = 1000 class C2(object): a = 100 b = 1000print(C1.a is C1.b) # Trueprint(C1.a is C2.a) # Trueprint(C1.c is C1.d) # True ?? 難道 cmd 中也有大整數池 ?? 類加載的時候是在一塊內存中,同值同地址 ?? print(C1.c is C2.b) # False# pycharm 等編輯器中a = 1000b = 1000a is b # True--------------------class C1(object): a = 100 b = 100 c = 1000 d = 1000 class C2(object): a = 100 b = 1000print(C1.a is C1.b) # Trueprint(C1.a is C2.a) # Trueprint(C1.c is C1.d) # Trueprint(C1.c is C2.b) # False字符串駐留機制

Python 解釋器為了提高字符串使用的效率和使用性能,編譯時,使用了 intern(字符串駐留)技術來提高字符串效率,什么是 intern 機制?即值同樣的字符串對象僅僅會保存一份,放在一個字符串儲蓄池中,是共用的,當然,肯定不能改變,這也決定了字符串必須是不可變對象(整數類型也是不可變對象)??,浮點數就不行 ;

簡單原理:

實現 Intern 保留機制的方式非常簡單,就是通過維護一個字符串儲蓄池,這個池子是一個字典結構,編譯時,如果字符串已經存在于池子中就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對象,如果之前還沒有加入到該池子中,則先構造一個字符串對象,并把這個對象加入到池子中去,方便下一次獲取。;但是,解釋器內部對intern 機制的使用策略是有考究的,有些場景會自動使用 intern ,有些地方需要通過手動方式才能啟動,看下面幾個常見情景:

# cmd 中浮點數沒有被緩存a = 1.0b = 1.0a is b # False# cmd 中并非全部的字符串都會采用intern機制; 僅 包括下劃線、數字、字母的字符串才會被 intern--類標識符s1='hello's2='hello's1 is s2 # True# 如果有空格,默認不啟用intern機制s1='hell o's2='hell o's1 is s2 # Falses1 = 'hell!*o's2 = 'hell!*o'print(s1 is s2) # False# 如果一個字符串長度超過20個字符,不啟動intern機制 -- 看網上很多都是這么寫的, 不超過二十個就為真,但是我在自己 3.7/8.5 版本上試了一下,發(fā)現好像沒有限制,不知道是 Python 更新了,還是什么問題……s1 = 'a' * 20s2 = 'a' * 20s1 is s2 # Trues1 = 'a' * 21s2 = 'a' * 21s1 is s2 # Trues1 = 'ab' * 10s2 = 'ab' * 10s1 is s2 # Trues1 = 'ab' * 11s2 = 'ab' * 11s1 is s2 # True# ’kz’ + ’c’ 編譯時已經變成 ’kzc’,而 s1 + ’c’ 中 s1 是變量, 會在運行時進行拼接,所以沒有被intern?’kz’ + ’c’ is ’kzc’ # Trues1 = ’kz’s2 = ’kzc’s1+’c’ is ’kzc’ # False# pycharm 等編輯器中,只要是同一個字符串,都為 True,并不用是下劃線、數字、字母的字符串s1 = 'hell o's2 = 'hell o'print(s1 is s2) # Trues1 = 'hell!*o's2 = 'hell!*o'print(s1 is s2) # Trues1 = 'a' * 20s2 = 'a' * 20print(s1 is s2) # Trues1 = 'a' * 21s2 = 'a' * 21print(s1 is s2) # Trues1 = 'ab' * 10s2 = 'ab' * 10print(s1 is s2) # Trues1 = 'ab' * 11s2 = 'ab' * 11print(s1 is s2) # True’kz’ + ’c’ is ’kzc’ # Trues1 = ’kz’s2 = ’kzc’s1+’c’ is ’kzc’ # False# 編輯器中,float 也被緩存了a = 1.0b = 1.0a is b

以上就是詳解Python 小數據池和代碼塊緩存機制的詳細內容,更多關于Python 小數據池和代碼塊緩存機制的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
色综合视频一区二区三区日韩| 婷婷亚洲成人| 青草av.久久免费一区| 石原莉奈在线亚洲二区| 欧美va天堂| 欧美va天堂| 国产专区一区| 国产一区二区三区自拍| 蜜臀91精品国产高清在线观看| 久久精品123| 日韩精品免费一区二区三区| 偷拍精品精品一区二区三区| 成人久久一区| 成人亚洲一区| 9999国产精品| 久久精品免费一区二区三区| 欧美午夜精彩| 中文不卡在线| 88久久精品| 麻豆视频一区| 91欧美日韩| 9色精品在线| 日产欧产美韩系列久久99| 91伊人久久| 九九九精品视频| 亚洲精品88| 9色精品在线| 欧美一区二区三区久久精品| 国产精久久久| 四季av一区二区凹凸精品| 99精品综合| 丝袜美腿一区二区三区| 日韩av中文字幕一区二区 | 国产一区二区三区探花| 麻豆久久久久久久| 日韩深夜视频| 在线视频精品| 国产日韩一区二区三区在线| 精品视频免费| 久久香蕉国产| 亚洲精品护士| 国产美女精品视频免费播放软件| 欧美1区2区3| 日本在线精品| 亚洲最新av| 美女国产精品久久久| 久久国产电影| 日韩美女精品| 国产一区二区三区精品在线观看| 亚洲天堂黄色| 亚洲色图综合| 久久av免费| 国产综合视频| 色综合视频一区二区三区日韩 | 亚洲精品系列| 国产伦精品一区二区三区千人斩| 在线看片国产福利你懂的| 国产综合色产| 国产精品天堂蜜av在线播放| 视频福利一区| 日韩精品久久久久久久软件91| 精品国产一区二区三区噜噜噜| 99久久99久久精品国产片果冰| 日韩高清成人在线| 欧美69视频| 国产精品一区亚洲| 在线成人直播| 九九九精品视频| 国产视频一区欧美| 精品入口麻豆88视频| 99国产一区| 日产精品一区二区| 亚久久调教视频| 伊人久久在线| 日本aⅴ亚洲精品中文乱码 | 精品国产一区二区三区噜噜噜| 在线综合视频| 国产精品99视频| 日本免费新一区视频| 99久精品视频在线观看视频| 国产欧美88| 免费人成精品欧美精品| 亚洲黄色免费av| 日本一区免费网站| 日韩电影免费网站| 欧美激情视频一区二区三区在线播放| 亚洲综合不卡| 久久精品91| 久久精品二区亚洲w码| 蜜臀av一区二区在线免费观看| 激情国产在线| 免费精品一区| 日韩美女精品| 视频一区视频二区中文字幕| 日本精品影院| 黄色精品视频| 久久av超碰| 日韩av在线免费观看不卡| 免费日韩av片| 日韩精品看片| 日韩av在线中文字幕| 国产精品欧美日韩一区| 亚洲日本免费电影| 99亚洲视频| 欧美午夜不卡| 黄色日韩精品| 国产在线欧美| 国产精品97| 久久久久久久久99精品大| 成人午夜网址| 国产成人久久精品麻豆二区| 欧美1区二区| 国产免费av一区二区三区| 亚洲精品一二三**| 午夜欧美理论片| 亚洲性视频h| 久久在线免费| 蜜臀久久99精品久久一区二区 | 欧美手机在线| 久久久久免费av| 欧美黄色网页| 精精国产xxxx视频在线播放 | 亚洲大片在线| 国产综合视频| 自由日本语亚洲人高潮| 日韩欧美一区二区三区在线视频 | 91久久国产| 91久久中文| 亚洲免费精品| 免费看黄色91| 午夜久久av | 麻豆久久一区二区| 精品免费视频| 日韩av专区| 久久婷婷丁香| 亚洲少妇在线| 日本综合精品一区| 久久国内精品视频| 久久99精品久久久久久园产越南 | 免费不卡中文字幕在线| 三级精品视频| 欧美日韩高清| 亚洲人成在线影院| 欧美三级第一页| 美女国产精品久久久| 中文字幕在线免费观看视频| 久久高清免费| 老牛影视一区二区三区| 日韩精品视频在线看| 国产伦理一区| 国产suv精品一区二区四区视频 | 国产专区精品| 日韩欧美1区| 亚洲欧美日本国产专区一区| 香蕉久久久久久| 久久久久亚洲精品中文字幕| 黄色在线网站噜噜噜| 99pao成人国产永久免费视频 | 国产精品一卡| 特黄毛片在线观看| 欧美日韩四区| 欧美在线91| 伊人久久国产| 免费人成在线不卡| 日韩av网站在线观看| 红杏一区二区三区| 亚洲激情av| 国产精品99久久免费观看| 日韩精品不卡一区二区| 丝袜美腿亚洲色图| 美女精品久久| 欧美日韩一二三四| 视频一区日韩精品| 日本久久综合| 伊人久久一区| 国产粉嫩在线观看| 久色成人在线| 精品国内亚洲2022精品成人| 日韩视频不卡| 久久av国产紧身裤| 亚洲国产影院| 国产精品日本一区二区三区在线| 99久久婷婷| 国产亚洲观看| 91九色精品| 久久久久久亚洲精品美女| 国产精品试看| 韩国一区二区三区视频| 日韩中文字幕一区二区三区| 久久一区欧美| 热久久久久久久| 四季av一区二区凹凸精品| 噜噜噜躁狠狠躁狠狠精品视频 | 日韩影院免费视频| 国产伊人久久| 综合激情网...| 欧美片第1页| 国产欧美在线观看免费| 夜夜精品视频| 国产乱码午夜在线视频|