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

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

詳解python 內(nèi)存優(yōu)化

瀏覽:99日期:2022-07-13 17:04:19

寫(xiě)在之前

圍繞類的話題,說(shuō)是說(shuō)不完的,僅在特殊方法,除了我們?cè)谇懊嬗龅竭^(guò)的 __init__(),__new__(),__str__() 等之外還有很多。雖然它們只是在某些特殊的場(chǎng)景中才會(huì)用到,但是學(xué)會(huì)它們卻可以成為你熟悉這門語(yǔ)言路上的鋪路石。

所以我會(huì)在試圖介紹一些「黑魔法」,讓大家多多感受一下 Python 的魅力所在,俗話說(shuō)「藝多不壓身」就是這個(gè)道理了。

內(nèi)存優(yōu)化

首先先讓我們從復(fù)習(xí)前面的類屬性和實(shí)例屬性的知識(shí)來(lái)引出另一個(gè)特殊方法:

>>> class Sample:... name = ’rocky’...

就像前面的文章我們所說(shuō)的,每個(gè)類都有一個(gè) __dict__() 屬性,它包含了當(dāng)前類的類屬性:

>>> Sample.__dict__mappingproxy({’__module__’: ’__main__’, ’name’: ’rocky’, ’__dict__’: <attribute ’__dict__’ of ’Sample’ objects>, ’__weakref__’: <attribute ’__weakref__’ of ’Sample’ objects>, ’__doc__’: None})>>> Sample.name’rocky’

同樣,如果我們創(chuàng)建了實(shí)例,每個(gè)實(shí)例也有一個(gè) __dict__ 屬性,它里面就是當(dāng)前的實(shí)例屬性:

>>> a = Sample()>>> a.__dict__{}>>> a.age = 23>>> a.__dict__{’age’: 23}

上面的操作可以看出,當(dāng)實(shí)例剛剛創(chuàng)建的時(shí)候,__dict__ 是空的,只有創(chuàng)建了實(shí)例屬性以后,它才包含其內(nèi)容。實(shí)例的 __dict__ 和類的 __dict__ 是有所區(qū)別的,即實(shí)例屬性和類屬性是不同的。

從理論上來(lái)說(shuō),我們可以根據(jù)一個(gè)類創(chuàng)建無(wú)數(shù)的實(shí)例,新建一個(gè)實(shí)例以后,又創(chuàng)建了一個(gè)新的 __dict__,這將是一個(gè)很可怕的事情,雖然每個(gè) __dict__ 所占的內(nèi)存空間很小,當(dāng)然這件事事實(shí)上是不會(huì)出現(xiàn)的。但是程序不能建立在這種不可靠的猜測(cè)的基礎(chǔ)上,程序要對(duì)過(guò)程有明確的控制。

所以就要有一種方法能夠控制 __dict__,于是「__slots__」應(yīng)運(yùn)而生。

>>> class Nature:... __slots__ = (’tree’,’flower’)... >>> dir(Nature)[’__class__’, ’__delattr__’, ’__dir__’, ’__doc__’, ’__eq__’, ’__format__’, ’__ge__’, ’__getattribute__’, ’__gt__’, ’__hash__’, ’__init__’, ’__init_subclass__’, ’__le__’, ’__lt__’, ’__module__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__setattr__’, ’__sizeof__’, ’__slots__’, ’__str__’, ’__subclasshook__’, ’flower’, ’tree’]

我們仔細(xì)來(lái)看 dir() 的結(jié)果,發(fā)現(xiàn) __dict__ 屬性沒(méi)有了,也就是說(shuō) __slots__ 把 __dict__ 擠出去了,它進(jìn)入了類的屬性。

>>> Nature.__slots__(’tree’, ’flower’)

從這里可以看出,類 Nature 有且僅有兩個(gè)屬性。從類的角度來(lái)看,其類屬性只有這兩個(gè);從實(shí)例的角度來(lái)看,其實(shí)例屬性也只有這兩個(gè)。

>>> Nature.tree = ’liushu’>>> Nature.tree’liushu’>>> Nature.tree = ’lishu’>>> Nature.tree’lishu’

通過(guò)類可以對(duì)屬性進(jìn)行賦值和修改,這個(gè)似乎和以前的類屬性沒(méi)有什么區(qū)別,別著急,繼續(xù)往下看就看到區(qū)別了:

>>> x = Nature()>>> x.__slots__(’tree’, ’flower’)>>> y = Nature()>>> y.__slots__(’tree’, ’flower’)>>> id(x.__slots__)4531629384>>> id(y.__slots__)4531629384

你看,實(shí)例化以后,實(shí)例的 __slots__ 和類的 __slots__ 完全一樣,這跟前面的 __dict__ 大不一樣了。并且我們建立了兩個(gè)實(shí)例,結(jié)果發(fā)現(xiàn)兩個(gè)實(shí)例的 __slots__ 在內(nèi)存中居然是一個(gè),或者可以說(shuō)是增加實(shí)例時(shí) __slots__ 并不增加。

>>> x.tree’lishu’>>> y.tree’lishu’

既然類屬性已經(jīng)賦值,那么通過(guò)任何一個(gè)實(shí)例屬性都能得到同樣的值,不過(guò)這時(shí)候不能通過(guò)實(shí)例修改此屬性的值。

>>> x.tree = ’taoshu’Traceback (most recent call last):File '<stdin>', line 1, in <module>AttributeError: ’Nature’ object attribute ’tree’ is read-only

對(duì)實(shí)例屬性來(lái)說(shuō),類的靜態(tài)數(shù)據(jù)是只讀的,不能修改,只有通過(guò)類屬性才能修改。但對(duì)于尚未賦值的屬性,能夠通過(guò)實(shí)例賦值。

>>> x.flower = ’rose’>>> x.flower’rose’>>> x.flower = ’moli’

顯然通過(guò)實(shí)例操作的屬性,也能夠通過(guò)實(shí)例修改,但是實(shí)例屬性的值并不能夠修改類屬性的值

Nature.flower<member ’flower’ of ’Nature’ objects>

由上面可以看出,實(shí)例屬性的值并沒(méi)有傳回給類屬性,也可以理解為新建了一個(gè)同名字的實(shí)例屬性,如果再給類屬性賦值的話,則會(huì)像下面一樣:

>>> Nature.flower = ’huaihua’>>> x.flower’huaihua’

類屬性對(duì)實(shí)例屬性具有決定作用,對(duì)實(shí)例而言,通過(guò)類所定義的屬性都是只讀的。

__slots__ 已經(jīng)把實(shí)例屬性牢牢的看管起來(lái),只能是指定的屬性,如果想要增加屬性的話,只能通過(guò)類屬性來(lái)實(shí)現(xiàn),所以 __slots__ 的一個(gè)重要作用就是優(yōu)化了內(nèi)存。

寫(xiě)在之后

當(dāng)然了,__slots__ 還能加快屬性加載速度,這個(gè)不是本文的重點(diǎn),所以不做過(guò)多的介紹,感興趣的可以去 Google 一下。

今天的文章就到這里啦,明天講一下「屬性攔截」,又是新的一周,燥起來(lái)!

如果你覺(jué)得文章對(duì)你有幫助的話,歡迎點(diǎn)贊轉(zhuǎn)發(fā),讓更多的人看到,謝謝啦。

The end。

以上就是詳解python 內(nèi)存優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于python 內(nèi)存優(yōu)化的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | LED显示屏_LED屏方案设计精准报价专业安装丨四川诺显科技 | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 餐饮加盟网_特色餐饮连锁加盟店-餐饮加盟官网 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 自动配料系统_称重配料控制系统厂家 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 长沙广告公司_制作,长沙喷绘_发光字_招牌制作_长沙泓润广告官网 长城人品牌官网 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 宜兴市恺瑞德环保科技有限公司| 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 真空上料机(一种真空输送机)-百科 | 氧化铁红厂家-淄博宗昂化工 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 |