Python死循環(huán)的極限PK,while True和for+ [無(wú)限迭代器],誰(shuí)更猛?
2024-05-05 加入收藏
歡迎訪(fǎng)問(wèn)Python3分鐘系列。花3分鐘時(shí)間,學(xué)習(xí)或溫習(xí)一個(gè)Python知識(shí)點(diǎn)。今天是第227。
今天在項(xiàng)目中也寫(xiě)了死循環(huán)(for循環(huán)),導(dǎo)致xxxx(省略100字..),被領(lǐng)導(dǎo)罵了。
然后我一個(gè)開(kāi)發(fā)同事就開(kāi)始和我爭(zhēng),表示他曾寫(xiě)的死循環(huán)(while循環(huán))導(dǎo)致的xxxx(省略200字)比我這個(gè)猛多了。
我肯定不服啊,表示for+無(wú)限迭代器是最猛。
這就引出了今天的討論主題:while True和for _ in [無(wú)限迭代器],誰(shuí)更猛?
“什么是無(wú)限迭代器?
無(wú)限迭代器是一種特殊的迭代器,它可以產(chǎn)生無(wú)限序列的元素。例如,
itertools.count
會(huì)從一個(gè)起始值開(kāi)始,無(wú)限地產(chǎn)生連續(xù)的整數(shù)。
直接上代碼吧!
import time
# 測(cè)試 while True 循環(huán)的性能
start_time = time.time()
counter = 0
while True:
counter += 1
if counter >= 10000000:
break
end_time = time.time()
while_true_duration = end_time - start_time
# 測(cè)試 for 循環(huán)與無(wú)限迭代器的性能
start_time = time.time()
for _ in iter(int, 1): # 使用 iter 創(chuàng)建一個(gè)無(wú)限迭代器
counter -= 1
if counter <= 0:
break
end_time = time.time()
for_loop_duration = end_time - start_time
print(f"while True 耗時(shí): {while_true_duration}")
print(f"for loop 耗時(shí): {for_loop_duration}")
代碼說(shuō)明
先通過(guò)while True
循環(huán)計(jì)數(shù)到10000000次來(lái)測(cè)量執(zhí)行時(shí)間。
接著,使用iter(int, 1)
創(chuàng)建一個(gè)無(wú)限迭代器,在for
循環(huán)中進(jìn)行相反的計(jì)數(shù)操作直到計(jì)數(shù)器歸零,同樣測(cè)量執(zhí)行時(shí)間。
代碼運(yùn)行結(jié)果
循環(huán)10,000,000次
while True 耗時(shí): 0.5636961460113525
for loop 耗時(shí): 0.816516637802124
循環(huán)100,000,000次
while True 耗時(shí): 5.133043527603149
for loop 耗時(shí): 9.265887975692749
為什么for+[無(wú)限迭代器]會(huì)執(zhí)行更慢?
迭代器開(kāi)銷(xiāo):在
for
循環(huán)中,使用iter(int, 1)
創(chuàng)建的無(wú)限迭代器可能引入了額外的開(kāi)銷(xiāo)。每次迭代時(shí),它都需要調(diào)用int
函數(shù)和進(jìn)行條件判斷,這些都會(huì)增加執(zhí)行時(shí)間。循環(huán)結(jié)構(gòu)差異:
while True
循環(huán)是Python
中最基本的循環(huán)結(jié)構(gòu),可能比涉及函數(shù)調(diào)用的for循環(huán)更直接和高效。Python解釋器優(yōu)化:
Python
的解釋器可能對(duì)while True
這樣的簡(jiǎn)單循環(huán)進(jìn)行了特定的優(yōu)化,使其執(zhí)行更快。
結(jié)論
我輸了。