Python中的yeild關鍵字提高代碼執(zhí)行效率場景實例探究
一、理解"yeild"關鍵字
"yeild"是Python中的一個特殊關鍵字,它用于在函數(shù)內(nèi)部生成一個生成器對象。生成器是一種可以在需要時按需生成值的迭代器,相比于傳統(tǒng)的列表或元組,生成器更加輕量級且內(nèi)存占用更少。通過使用"yeild"關鍵字,我們可以將一個函數(shù)變成一個生成器函數(shù),從而在需要時生成新的值。
如果說到這里,你覺得還是不好理解,那么你可以簡單粗暴的把yeild想象成一個跟return差不多的東西,但它跟return是有區(qū)別的。
但yield 不是真正的返回結果給你,而是暫停當前函數(shù),返回一個迭代器。每一次迭代的時候,都返回一個新的數(shù)值。
但為什么不用return呢,因為return之后,return之后的代碼就不會再執(zhí)行了,相當于只會返回一次值程序就結束了。
當然在非無限循環(huán)的場景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結果返回。
但是這里有需要注意的地方,當你需要返回的數(shù)據(jù)量很大的時候,程序會占用大量內(nèi)存,這是很危險的行為。
使用yeild呢,yeild返回的只是一個生成器,你每取值一次,生成器才給你返回一個真實值,這樣就可以大大減少機器性能壓力了。
二、"yeild"關鍵字的使用場景
無限序列:當需要處理一個無限序列時,使用"yeild"關鍵字可以避免一次性加載所有數(shù)據(jù)到內(nèi)存中,而是按需生成數(shù)據(jù)。
大量數(shù)據(jù)處理:當需要處理大量數(shù)據(jù)時,使用"yeild"關鍵字可以減少內(nèi)存占用,提高程序的性能。例如,從文件中逐行讀取數(shù)據(jù)并進行處理。
遞歸算法:使用"yeild"關鍵字可以將遞歸算法轉(zhuǎn)化為迭代算法,從而提高程序的性能。例如,計算階乘時可以使用"yeild"關鍵字。
三、實際代碼
def infinite_sequence(): num = 0 while True: """ [來自python學習與大數(shù)據(jù)分析微信公眾號的友情提醒] 這里的 yield 相當于 return,但不是真正的返回,而是暫停當前函數(shù),返回一個迭代器。每一次迭代的時候,都返回一個新的數(shù)值。 但為什么不用return呢,因為return之后,return之后的代碼就不會再執(zhí)行了,相當于只會返回一次值程序就結束了。 當然在非無限循環(huán)的場景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結果返回。 但是這里有需要注意的地方,當你需要返回的數(shù)據(jù)量很大的時候,程序會占用大量內(nèi)存,這是很危險的行為。 使用yeild呢,yeild返回的只是一個生成器,你每取值一次,生成器才給你返回一個真實值,這樣就可以大大減少機器性能壓力了。 """ yield num num += 1 for i in infinite_sequence(): print(i)
在上面的代碼中,我們定義了一個名為infinite_sequence的生成器函數(shù),它會生成一個無限的整數(shù)序列。通過使用yeild關鍵字,我們可以在每次迭代時生成一個新的值。
下面我們再來看下讀取大數(shù)據(jù)量文件時,使用yeild的場景:
def process_data(file_path): with open(file_path, 'r') as file: for line in file: """ [來自python學習與大數(shù)據(jù)分析微信公眾號的友情提醒] 假設:file_path這個文件的數(shù)據(jù)量很大的時候,比如成千上萬行的時候, 如果你是直接將數(shù)據(jù)放到一個變量里return返回的話,就會大量占用內(nèi)存。 """ yield line.strip() data = process_data('monitor.log') for line in data: # 處理每一行數(shù)據(jù),減少內(nèi)存占用 print(line)
當然了,如果你在調(diào)試代碼的時候,不想使用for循環(huán)來遍歷所有的生成器數(shù)據(jù),你可以使用next()方法來取得生成器的下一個值。
def process_data(file_path): with open(file_path, 'r') as file: for line in file: """ [來自python學習與大數(shù)據(jù)分析微信公眾號的友情提醒] 假設:file_path這個文件的數(shù)據(jù)量很大的時候,比如成千上萬行的時候, 如果你是直接將數(shù)據(jù)放到一個變量里return返回的話,就會大量占用內(nèi)存。 """ yield line.strip() data = process_data('monitor.log') # for line in data: # # 處理每一行數(shù)據(jù),減少內(nèi)存占用 # print(line) # 當然了,除了通過上面的for循環(huán)來獲取數(shù)據(jù)外,你還可以通過next()函數(shù)來獲取數(shù)據(jù)。 print(next(data)) print(next(data)) print(next(data))
以上就是yeild的一些使用方法及注意事項。注:以上代碼在我本地均運行通過了的(有圖為證,哈哈),大家只需要把代碼中涉及到的文件地址改成自己的地址即可,更多關于Python yeild關鍵字的資料請關注腳本之家其它相關文章!
相關文章
python dataprep庫簡化加速數(shù)據(jù)科學操作
這篇文章主要為大家介紹了python dataprep庫簡化加速數(shù)據(jù)科學操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Python實現(xiàn)繪制Matlab格式的地圖邊框的示例代碼
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)繪制Matlab格式的地圖邊框,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下2022-09-09