电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Python小數(shù)據(jù)池和代碼塊緩存機(jī)制

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

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

總結(jié):

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

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

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

1.代碼塊的緩存機(jī)制

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

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

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

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.小數(shù)據(jù)池

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

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

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

# 長度為0與1的字符串一定會(huì)被駐留;# 字符串駐留發(fā)生在程序編譯時(shí);# 被駐留的字符串必須由 ASCll字母, 數(shù)字以及下劃線組成;>>>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)缺點(diǎn)

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

缺點(diǎn):拼接字符串、對字符串修改之類的影響性能;因?yàn)槭遣豢勺兊模詫ψ址薷牟皇?inplace 就地操作,要新建對象,這也是為什么拼接多字符串的時(shí)候不建議用 + 而用 join();join() 是先計(jì)算出所有字符串的長度,然后一一拷貝,只 new 一次對象;

小整數(shù)對象池

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

# 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大整數(shù)對象池

cmd 終端中,大整數(shù)每賦值一次,每次的大整數(shù)都會(huì)重新創(chuàng)建,Pycharm 中,每次運(yùn)行時(shí),所有代碼都加載到內(nèi)存中,屬于一個(gè)整體,所以這個(gè)時(shí)候會(huì)有一個(gè)大整數(shù)對象池處于一個(gè)代碼塊的大整數(shù)是同一個(gè)對象;c 和 d 處于一個(gè)代碼塊,而 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 中也有大整數(shù)池 ?? 類加載的時(shí)候是在一塊內(nèi)存中,同值同地址 ?? 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字符串駐留機(jī)制

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

簡單原理:

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

# cmd 中浮點(diǎn)數(shù)沒有被緩存a = 1.0b = 1.0a is b # False# cmd 中并非全部的字符串都會(huì)采用intern機(jī)制; 僅 包括下劃線、數(shù)字、字母的字符串才會(huì)被 intern--類標(biāo)識符s1='hello's2='hello's1 is s2 # True# 如果有空格,默認(rèn)不啟用intern機(jī)制s1='hell o's2='hell o's1 is s2 # Falses1 = 'hell!*o's2 = 'hell!*o'print(s1 is s2) # False# 如果一個(gè)字符串長度超過20個(gè)字符,不啟動(dòng)intern機(jī)制 -- 看網(wǎng)上很多都是這么寫的, 不超過二十個(gè)就為真,但是我在自己 3.7/8.5 版本上試了一下,發(fā)現(xiàn)好像沒有限制,不知道是 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’ 編譯時(shí)已經(jīng)變成 ’kzc’,而 s1 + ’c’ 中 s1 是變量, 會(huì)在運(yùn)行時(shí)進(jìn)行拼接,所以沒有被intern?’kz’ + ’c’ is ’kzc’ # Trues1 = ’kz’s2 = ’kzc’s1+’c’ is ’kzc’ # False# pycharm 等編輯器中,只要是同一個(gè)字符串,都為 True,并不用是下劃線、數(shù)字、字母的字符串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 小數(shù)據(jù)池和代碼塊緩存機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于Python 小數(shù)據(jù)池和代碼塊緩存機(jī)制的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 福建成考网-福建成人高考网| 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 座椅式升降机_无障碍升降平台_残疾人升降平台-南京明顺机械设备有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 「阿尔法设计官网」工业设计_产品设计_产品外观设计 深圳工业设计公司 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 火锅底料批发-串串香技术培训[川禾川调官网] | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, |