Python中的yeild關(guān)鍵字提高代碼執(zhí)行效率場(chǎng)景實(shí)例探究
一、理解"yeild"關(guān)鍵字
"yeild"是Python中的一個(gè)特殊關(guān)鍵字,它用于在函數(shù)內(nèi)部生成一個(gè)生成器對(duì)象。生成器是一種可以在需要時(shí)按需生成值的迭代器,相比于傳統(tǒng)的列表或元組,生成器更加輕量級(jí)且內(nèi)存占用更少。通過(guò)使用"yeild"關(guān)鍵字,我們可以將一個(gè)函數(shù)變成一個(gè)生成器函數(shù),從而在需要時(shí)生成新的值。
如果說(shuō)到這里,你覺(jué)得還是不好理解,那么你可以簡(jiǎn)單粗暴的把yeild想象成一個(gè)跟return差不多的東西,但它跟return是有區(qū)別的。
但yield 不是真正的返回結(jié)果給你,而是暫停當(dāng)前函數(shù),返回一個(gè)迭代器。每一次迭代的時(shí)候,都返回一個(gè)新的數(shù)值。
但為什么不用return呢,因?yàn)閞eturn之后,return之后的代碼就不會(huì)再執(zhí)行了,相當(dāng)于只會(huì)返回一次值程序就結(jié)束了。
當(dāng)然在非無(wú)限循環(huán)的場(chǎng)景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結(jié)果返回。
但是這里有需要注意的地方,當(dāng)你需要返回的數(shù)據(jù)量很大的時(shí)候,程序會(huì)占用大量?jī)?nèi)存,這是很危險(xiǎn)的行為。
使用yeild呢,yeild返回的只是一個(gè)生成器,你每取值一次,生成器才給你返回一個(gè)真實(shí)值,這樣就可以大大減少機(jī)器性能壓力了。
二、"yeild"關(guān)鍵字的使用場(chǎng)景
無(wú)限序列:當(dāng)需要處理一個(gè)無(wú)限序列時(shí),使用"yeild"關(guān)鍵字可以避免一次性加載所有數(shù)據(jù)到內(nèi)存中,而是按需生成數(shù)據(jù)。
大量數(shù)據(jù)處理:當(dāng)需要處理大量數(shù)據(jù)時(shí),使用"yeild"關(guān)鍵字可以減少內(nèi)存占用,提高程序的性能。例如,從文件中逐行讀取數(shù)據(jù)并進(jìn)行處理。
遞歸算法:使用"yeild"關(guān)鍵字可以將遞歸算法轉(zhuǎn)化為迭代算法,從而提高程序的性能。例如,計(jì)算階乘時(shí)可以使用"yeild"關(guān)鍵字。
三、實(shí)際代碼
def infinite_sequence(): num = 0 while True: """ [來(lái)自python學(xué)習(xí)與大數(shù)據(jù)分析微信公眾號(hào)的友情提醒] 這里的 yield 相當(dāng)于 return,但不是真正的返回,而是暫停當(dāng)前函數(shù),返回一個(gè)迭代器。每一次迭代的時(shí)候,都返回一個(gè)新的數(shù)值。 但為什么不用return呢,因?yàn)閞eturn之后,return之后的代碼就不會(huì)再執(zhí)行了,相當(dāng)于只會(huì)返回一次值程序就結(jié)束了。 當(dāng)然在非無(wú)限循環(huán)的場(chǎng)景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結(jié)果返回。 但是這里有需要注意的地方,當(dāng)你需要返回的數(shù)據(jù)量很大的時(shí)候,程序會(huì)占用大量?jī)?nèi)存,這是很危險(xiǎn)的行為。 使用yeild呢,yeild返回的只是一個(gè)生成器,你每取值一次,生成器才給你返回一個(gè)真實(shí)值,這樣就可以大大減少機(jī)器性能壓力了。 """ yield num num += 1 for i in infinite_sequence(): print(i)
在上面的代碼中,我們定義了一個(gè)名為infinite_sequence的生成器函數(shù),它會(huì)生成一個(gè)無(wú)限的整數(shù)序列。通過(guò)使用yeild關(guān)鍵字,我們可以在每次迭代時(shí)生成一個(gè)新的值。
下面我們?cè)賮?lái)看下讀取大數(shù)據(jù)量文件時(shí),使用yeild的場(chǎng)景:
def process_data(file_path): with open(file_path, 'r') as file: for line in file: """ [來(lái)自python學(xué)習(xí)與大數(shù)據(jù)分析微信公眾號(hào)的友情提醒] 假設(shè):file_path這個(gè)文件的數(shù)據(jù)量很大的時(shí)候,比如成千上萬(wàn)行的時(shí)候, 如果你是直接將數(shù)據(jù)放到一個(gè)變量里return返回的話,就會(huì)大量占用內(nèi)存。 """ yield line.strip() data = process_data('monitor.log') for line in data: # 處理每一行數(shù)據(jù),減少內(nèi)存占用 print(line)
當(dāng)然了,如果你在調(diào)試代碼的時(shí)候,不想使用for循環(huán)來(lái)遍歷所有的生成器數(shù)據(jù),你可以使用next()方法來(lái)取得生成器的下一個(gè)值。
def process_data(file_path): with open(file_path, 'r') as file: for line in file: """ [來(lái)自python學(xué)習(xí)與大數(shù)據(jù)分析微信公眾號(hào)的友情提醒] 假設(shè):file_path這個(gè)文件的數(shù)據(jù)量很大的時(shí)候,比如成千上萬(wàn)行的時(shí)候, 如果你是直接將數(shù)據(jù)放到一個(gè)變量里return返回的話,就會(huì)大量占用內(nèi)存。 """ yield line.strip() data = process_data('monitor.log') # for line in data: # # 處理每一行數(shù)據(jù),減少內(nèi)存占用 # print(line) # 當(dāng)然了,除了通過(guò)上面的for循環(huán)來(lái)獲取數(shù)據(jù)外,你還可以通過(guò)next()函數(shù)來(lái)獲取數(shù)據(jù)。 print(next(data)) print(next(data)) print(next(data))
以上就是yeild的一些使用方法及注意事項(xiàng)。注:以上代碼在我本地均運(yùn)行通過(guò)了的(有圖為證,哈哈),大家只需要把代碼中涉及到的文件地址改成自己的地址即可,更多關(guān)于Python yeild關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python dataprep庫(kù)簡(jiǎn)化加速數(shù)據(jù)科學(xué)操作
這篇文章主要為大家介紹了python dataprep庫(kù)簡(jiǎn)化加速數(shù)據(jù)科學(xué)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python中順序表原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Python中順序表原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python順序表的概念、原理及增刪查等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12Python實(shí)現(xiàn)繪制Matlab格式的地圖邊框的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)繪制Matlab格式的地圖邊框,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2022-09-09python?面向?qū)ο箝_(kāi)發(fā)及基本特征
面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類(lèi)”和 “對(duì)象”來(lái)實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對(duì) “類(lèi)”和“對(duì)象” 的使用,今天給大家介紹下python?面向?qū)ο箝_(kāi)發(fā)及基本特征,感興趣的朋友一起看看吧2022-03-03Python和RabbitMQ進(jìn)行消息傳遞和處理方式
這篇文章主要介紹了Python和RabbitMQ進(jìn)行消息傳遞和處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07python學(xué)習(xí)之基于Python的人臉識(shí)別技術(shù)學(xué)習(xí)
面部識(shí)別技術(shù)的應(yīng)用越來(lái)越廣泛,它廣泛應(yīng)用于安全系統(tǒng)、人機(jī)交互、社交媒體、醫(yī)療保健等領(lǐng)域。本文介紹了基于Python的人臉識(shí)別技術(shù),感興趣的小伙伴可以參考閱讀2023-03-03sqlalchemy對(duì)象轉(zhuǎn)dict的示例
這篇文章主要介紹了sqlalchemy對(duì)象轉(zhuǎn)dict的示例,需要的朋友可以參考下2014-04-04