Python中的yeild關(guān)鍵字提高代碼執(zhí)行效率場景實例探究
一、理解"yeild"關(guān)鍵字
"yeild"是Python中的一個特殊關(guān)鍵字,它用于在函數(shù)內(nèi)部生成一個生成器對象。生成器是一種可以在需要時按需生成值的迭代器,相比于傳統(tǒng)的列表或元組,生成器更加輕量級且內(nèi)存占用更少。通過使用"yeild"關(guān)鍵字,我們可以將一個函數(shù)變成一個生成器函數(shù),從而在需要時生成新的值。
如果說到這里,你覺得還是不好理解,那么你可以簡單粗暴的把yeild想象成一個跟return差不多的東西,但它跟return是有區(qū)別的。
但yield 不是真正的返回結(jié)果給你,而是暫停當前函數(shù),返回一個迭代器。每一次迭代的時候,都返回一個新的數(shù)值。
但為什么不用return呢,因為return之后,return之后的代碼就不會再執(zhí)行了,相當于只會返回一次值程序就結(jié)束了。
當然在非無限循環(huán)的場景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結(jié)果返回。
但是這里有需要注意的地方,當你需要返回的數(shù)據(jù)量很大的時候,程序會占用大量內(nèi)存,這是很危險的行為。
使用yeild呢,yeild返回的只是一個生成器,你每取值一次,生成器才給你返回一個真實值,這樣就可以大大減少機器性能壓力了。
二、"yeild"關(guān)鍵字的使用場景
無限序列:當需要處理一個無限序列時,使用"yeild"關(guān)鍵字可以避免一次性加載所有數(shù)據(jù)到內(nèi)存中,而是按需生成數(shù)據(jù)。
大量數(shù)據(jù)處理:當需要處理大量數(shù)據(jù)時,使用"yeild"關(guān)鍵字可以減少內(nèi)存占用,提高程序的性能。例如,從文件中逐行讀取數(shù)據(jù)并進行處理。
遞歸算法:使用"yeild"關(guān)鍵字可以將遞歸算法轉(zhuǎn)化為迭代算法,從而提高程序的性能。例如,計算階乘時可以使用"yeild"關(guān)鍵字。
三、實際代碼
def infinite_sequence():
num = 0
while True:
"""
[來自python學習與大數(shù)據(jù)分析微信公眾號的友情提醒]
這里的 yield 相當于 return,但不是真正的返回,而是暫停當前函數(shù),返回一個迭代器。每一次迭代的時候,都返回一個新的數(shù)值。
但為什么不用return呢,因為return之后,return之后的代碼就不會再執(zhí)行了,相當于只會返回一次值程序就結(jié)束了。
當然在非無限循環(huán)的場景下,你完成可以將所有的值存放到列表或者元祖中,然后使用return一次性將所有結(jié)果返回。
但是這里有需要注意的地方,當你需要返回的數(shù)據(jù)量很大的時候,程序會占用大量內(nèi)存,這是很危險的行為。
使用yeild呢,yeild返回的只是一個生成器,你每取值一次,生成器才給你返回一個真實值,這樣就可以大大減少機器性能壓力了。
"""
yield num
num += 1
for i in infinite_sequence():
print(i)
在上面的代碼中,我們定義了一個名為infinite_sequence的生成器函數(shù),它會生成一個無限的整數(shù)序列。通過使用yeild關(guān)鍵字,我們可以在每次迭代時生成一個新的值。
下面我們再來看下讀取大數(shù)據(jù)量文件時,使用yeild的場景:
def process_data(file_path):
with open(file_path, 'r') as file:
for line in file:
"""
[來自python學習與大數(shù)據(jù)分析微信公眾號的友情提醒]
假設(shè):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ù)分析微信公眾號的友情提醒]
假設(shè):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的一些使用方法及注意事項。注:以上代碼在我本地均運行通過了的(有圖為證,哈哈),大家只需要把代碼中涉及到的文件地址改成自己的地址即可,更多關(guān)于Python yeild關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pandas中DataFrame數(shù)據(jù)刪除詳情
這篇文章主要以介紹的是Pandas中DataFrame的數(shù)據(jù)刪除的相關(guān)資料,主要使用drop、del方式,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法
這篇文章主要為大家詳細介紹了python如何使用opencv2和PIL實現(xiàn)將圖片透明背景轉(zhuǎn)換成白色背景功能,感興趣的小伙伴可以跟隨小編一起學習一下2025-05-05
python報錯解決之python運行bat文件的各種問題處理
這篇文章主要介紹了python報錯解決之python運行bat文件的各種問題處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
使用Python在Excel工作表中創(chuàng)建圖表的實現(xiàn)步驟
在現(xiàn)代企業(yè)中,數(shù)據(jù)驅(qū)動的決策變得越來越重要,Excel作為企業(yè)中最常用的數(shù)據(jù)分析工具,其強大的表格和圖表功能在日常工作中不可或缺,然而,當面對成百上千條數(shù)據(jù)或需要生成定期報告時,手動制作圖表不僅耗時,還容易出錯,所以本文介紹了如何實現(xiàn)Excel圖表自動化生成2025-12-12

