Python3中延時(shí)變量和 free_list鏈表的區(qū)別解析
1、概念
1、區(qū)別
在Python3中,"延時(shí)變量" 和 "free_list鏈表" 是兩個(gè)不同的概念,他們之間沒(méi)有直接聯(lián)系。
2、延時(shí)變量(Lazy evaluation)
延時(shí)變量是指在某些情況下,Python不會(huì)立即計(jì)算表達(dá)式的值,而是等到需要用到這個(gè)值的時(shí)候在進(jìn)行計(jì)算。這種方式稱為 "惰性計(jì)算" 或 "延時(shí)計(jì)算"。
例如:生成器(generator)就是一種延時(shí)計(jì)算的方式。
當(dāng)創(chuàng)建一個(gè)生成器對(duì)象時(shí),它不會(huì)立即生成所有的值,而是在需要時(shí)逐個(gè)生成,這種方式的優(yōu)點(diǎn)是:節(jié)省內(nèi)存空間和計(jì)算資源
3. free_list鏈表
free_list 鏈表 是Python3中的一個(gè)內(nèi)存管理機(jī)制。采用了垃圾回收機(jī)制來(lái)自動(dòng)管理內(nèi)存空間,其中free_list鏈表是一種可以重復(fù)利用已經(jīng)分配但未被使用的內(nèi)存塊的機(jī)制。
當(dāng)創(chuàng)建一個(gè)新對(duì)象時(shí),Python會(huì)分配一塊內(nèi)存空間,并將其標(biāo)記為已使用。當(dāng)對(duì)象不在被引用時(shí),Python會(huì)自動(dòng)將其標(biāo)記為未使用,并將其添加到free_list鏈表中。當(dāng)下次創(chuàng)建對(duì)象時(shí),Python會(huì)首先檢查free_list鏈表中是否有可重復(fù)利用的內(nèi)存塊,從而避免不必要的內(nèi)存分配和釋放操作。
2、示例
1. 延時(shí)變量示例
在這個(gè)示例中,定義了一個(gè)生成器函數(shù) fibonacci()
,實(shí)現(xiàn)了斐波那契數(shù)列的生成邏輯。當(dāng)我們創(chuàng)建一個(gè)生成器對(duì)象 fib
時(shí),它不會(huì)立即生成所有的斐波那契數(shù)列數(shù)值,而是在需要時(shí)逐個(gè)生成。在這里,我們使用了 next()
函數(shù)來(lái)獲取下一個(gè)斐波那契數(shù)列數(shù)值。
# 定義一個(gè)生成器,實(shí)現(xiàn)斐波那契數(shù)列 def fibonacci(): a, b = 0, 1 while True: yield a a , b = b, a+b #創(chuàng)建一個(gè)生成器對(duì)象 fib = fibonacci() #打印前 10 個(gè)斐波那契數(shù)列數(shù)值 for i in range(10): print(next(fib)) ''' 執(zhí)行結(jié)果如下: 0 1 1 2 3 5 8 13 21 34 '''
2.free_list鏈表
在這個(gè)示例中,我們先創(chuàng)建了兩個(gè)相同的列表對(duì)象 a
和 b
,并打印它們的內(nèi)存地址。然后,我們將 a
對(duì)象從內(nèi)存中刪除,并使用 gc.collect()
強(qiáng)制進(jìn)行垃圾回收。接著,我們創(chuàng)建了一個(gè)新的列表對(duì)象 c
,并打印它的內(nèi)存地址。最后,我們使用 sys.getsizeof([])
函數(shù)檢查 free_list 鏈表中是否有可重復(fù)利用的內(nèi)存塊
import sys import gc #創(chuàng)建兩個(gè)相同的列表對(duì)象 a = [1, 2, 3] b = [1, 2, 3] #打印a和b對(duì)象的內(nèi)存地址 print("a 的內(nèi)存地址:", id(a)) print("b 的內(nèi)存地址:", id(b)) #將a 對(duì)象從內(nèi)存中刪除 del a # 創(chuàng)建一個(gè)新的列表對(duì)象 c # 強(qiáng)制進(jìn)行垃圾回收 gc.collect() c = [1, 2, 3] #打印 c 對(duì)象的內(nèi)存地址 print("c 的內(nèi)存地址:", id(c)) #檢查 free_list 鏈表中是否有可重復(fù)利用的內(nèi)存塊 print("free_list 鏈表:", sys.getsizeof([])) ''' 執(zhí)行結(jié)果如下: a 的內(nèi)存地址: 22203400 b 的內(nèi)存地址: 22201928 c 的內(nèi)存地址: 21904648 free_list 鏈表: 64 '''
gc.collect()
可以強(qiáng)制進(jìn)行垃圾回收,但并不意味著內(nèi)存會(huì)立即被清空。Python 中的內(nèi)存管理是由解釋器和操作系統(tǒng)共同管理的,具體的內(nèi)存分配和回收時(shí)機(jī)也受到多種因素的影響,如垃圾回收器算法、系統(tǒng)內(nèi)存使用情況等。在上面的示例中,當(dāng)我們刪除
a
對(duì)象并調(diào)用gc.collect()
進(jìn)行垃圾回收時(shí),Python 解釋器會(huì)將a
對(duì)象所占用的內(nèi)存標(biāo)記為可回收狀態(tài),并將其添加到垃圾回收器的待回收列表中。但是,這并不意味著內(nèi)存立即被回收,而是在垃圾回收器的下一輪回收時(shí)才會(huì)被清理。另外,即使
a
對(duì)象所占用的內(nèi)存被回收了,也不一定意味著該內(nèi)存空間被立即釋放,因?yàn)?Python 中的內(nèi)存管理采用了一種延遲分配的機(jī)制,即只有當(dāng)需要申請(qǐng)更多內(nèi)存時(shí),Python 才會(huì)向操作系統(tǒng)請(qǐng)求分配新的內(nèi)存空間。因此,在上面的示例中,雖然a
對(duì)象的內(nèi)存空間可能已經(jīng)被回收,但該內(nèi)存空間可能仍然被 Python 解釋器保留以供未來(lái)使用,從而避免不必要的內(nèi)存分配和釋放開銷。需要注意的是,即使
a
、b
、c
三個(gè)對(duì)象的內(nèi)存地址不重復(fù),也并不意味著它們占用的內(nèi)存空間不會(huì)重疊。這是因?yàn)?,Python 中的內(nèi)存管理方式是以對(duì)象為單位進(jìn)行分配和管理的,每個(gè)對(duì)象占用的內(nèi)存空間可能是不連續(xù)的,因此不同對(duì)象的內(nèi)存空間可能會(huì)部分重疊。
到此這篇關(guān)于Python3中延時(shí)變量和 free_list鏈表的區(qū)別的文章就介紹到這了,更多相關(guān)Python延時(shí)變量和 free_list鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
攻擊者是如何將PHP Phar包偽裝成圖像以繞過(guò)文件類型檢測(cè)的(推薦)
這篇文章主要介紹了攻擊者是如何將PHP Phar包偽裝成圖像以繞過(guò)文件類型檢測(cè)的,需要的朋友可以參考下2018-10-10Python設(shè)計(jì)模式之工廠模式簡(jiǎn)單示例
這篇文章主要介紹了Python設(shè)計(jì)模式之工廠模式,簡(jiǎn)單說(shuō)明了工廠模式的原理,并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)工廠模式的具體操作技巧,需要的朋友可以參考下2018-01-01Python爬蟲實(shí)戰(zhàn)之使用Scrapy爬取豆瓣圖片
在用Python的urllib和BeautifulSoup寫過(guò)了很多爬蟲之后,本人決定嘗試著名的Python爬蟲框架——Scrapy.本次分享將詳細(xì)講述如何利用Scrapy來(lái)下載豆瓣名人圖片,需要的朋友可以參考下2021-06-06Python異步處理返回進(jìn)度——使用Flask實(shí)現(xiàn)進(jìn)度條
這篇文章主要介紹了Python異步處理返回進(jìn)度——使用Flask實(shí)現(xiàn)進(jìn)度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05深入講解Python中面向?qū)ο缶幊痰南嚓P(guān)知識(shí)
這篇文章主要介紹了深入講解Python中面向?qū)ο缶幊痰南嚓P(guān)知識(shí),是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python獲取統(tǒng)計(jì)自己的qq群成員信息的方法
這篇文章主要介紹了Python獲取統(tǒng)計(jì)自己的qq群成員信息的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11python utc datetime轉(zhuǎn)換為時(shí)間戳的方法
今天小編就為大家分享一篇python utc datetime轉(zhuǎn)換為時(shí)間戳的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01