国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Python 實現循環的最快方式(for、while 等速度對比)

開發 后端
while 和 for 是 Python 中常用的兩種實現循環的關鍵字,它們的運行效率實際上是有差距的。

 [[438704]]

眾所周知,Python 不是一種執行效率較高的語言。此外在任何語言中,循環都是一種非常消耗時間的操作。假如任意一種簡單的單步操作耗費的時間為 1 個單位,將此操作重復執行上萬次,最終耗費的時間也將增長上萬倍。

while 和 for 是 Python 中常用的兩種實現循環的關鍵字,它們的運行效率實際上是有差距的。比如下面的測試代碼: 

  1. import timeit  
  2. def while_loop(n=100_000_000):  
  3.     i = 0  
  4.     s = 0  
  5.     while i < n:  
  6.         s += i  
  7.         i += 1 
  8.     return s 
  9. def for_loop(n=100_000_000):  
  10.     s = 0  
  11.     for i in range(n):  
  12.         s += i  
  13.     return s  
  14. def main():  
  15.     print('while loop\t\t', timeit.timeit(while_loop, number=1))  
  16.     print('for loop\t\t', timeit.timeit(for_loop, number=1))  
  17. if __name__ == '__main__':  
  18.     main()  
  19. # => while loop               4.718853999860585  
  20. # => for loop                 3.211570399813354 

這是一個簡單的求和操作,計算從 1 到 n 之間所有自然數的總和。可以看到 for 循環相比 while 要快 1.5 秒。

其中的差距主要在于兩者的機制不同。

在每次循環中,while 實際上比 for 多執行了兩步操作:邊界檢查和變量 i 的自增。即每進行一次循環,while 都會做一次邊界檢查 (while i < n)和自增計算(i +=1)。這兩步操作都是顯式的純 Python 代碼。

for 循環不需要執行邊界檢查和自增操作,沒有增加顯式的 Python 代碼(純 Python 代碼效率低于底層的 C 代碼)。當循環的次數足夠多,就出現了明顯的效率差距。

可以再增加兩個函數,在 for 循環中加上不必要的邊界檢查和自增計算: 

  1. import timeit  
  2. def while_loop(n=100_000_000):  
  3.     i = 0  
  4.     s = 0  
  5.     while i < n:  
  6.         s += i  
  7.         i += 1  
  8.     return s  
  9. def for_loop(n=100_000_000):  
  10.     s = 0  
  11.     for i in range(n):  
  12.         s += i  
  13.     return s  
  14. def for_loop_with_inc(n=100_000_000):  
  15.     s = 0  
  16.     for i in range(n):  
  17.         s += i  
  18.         i += 1  
  19.     return s  
  20. def for_loop_with_test(n=100_000_000):  
  21.     s = 0  
  22.     for i in range(n):  
  23.         if i < n:  
  24.             pass  
  25.         s += i  
  26.     return s  
  27. def main():  
  28.     print('while loop\t\t', timeit.timeit(while_loop, number=1))  
  29.     print('for loop\t\t', timeit.timeit(for_loop, number=1))  
  30.     print('for loop with increment\t\t',  
  31.           timeit.timeit(for_loop_with_inc, number=1))  
  32.     print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=1))  
  33. if __name__ == '__main__': 
  34.     main()  
  35. # => while loop               4.718853999860585  
  36. # => for loop                 3.211570399813354  
  37. # => for loop with increment          4.602369500091299  
  38. # => for loop with test               4.18337869993411 

可以看出,增加的邊界檢查和自增操作確實大大影響了 for 循環的執行效率。

前面提到過,Python 底層的解釋器和內置函數是用 C 語言實現的。而 C 語言的執行效率遠大于 Python。

對于上面的求等差數列之和的操作,借助于 Python 內置的 sum 函數,可以獲得遠大于 for 或 while 循環的執行效率。 

  1. import timeit  
  2. def while_loop(n=100_000_000):  
  3.     i = 0  
  4.     s = 0  
  5.     while i < n:  
  6.         s += i  
  7.         i += 1  
  8.     return s  
  9. def for_loop(n=100_000_000):  
  10.     s = 0  
  11.     for i in range(n):  
  12.         s += i  
  13.     return s  
  14. def sum_range(n=100_000_000):  
  15.     return sum(range(n))  
  16. def main():  
  17.     print('while loop\t\t', timeit.timeit(while_loop, number=1))  
  18.     print('for loop\t\t', timeit.timeit(for_loop, number=1))  
  19.     print('sum range\t\t', timeit.timeit(sum_range, number=1))  
  20. if __name__ == '__main__':  
  21.     main()  
  22. # => while loop               4.718853999860585  
  23. # => for loop                 3.211570399813354  
  24. # => sum range                0.8658821999561042 

可以看到,使用內置函數 sum 替代循環之后,代碼的執行效率實現了成倍的增長。

內置函數 sum 的累加操作實際上也是一種循環,但它由 C 語言實現,而 for 循環中的求和操作是由純 Python 代碼 s += i 實現的。C > Python。

再拓展一下思維。小時候都聽說過童年高斯巧妙地計算 1 到 100 之和的故事。1…100 之和等于 (1 + 100) * 50。這個計算方法同樣可以應用到上面的求和操作中。 

  1. import timeit  
  2. def while_loop(n=100_000_000):  
  3.     i = 0  
  4.     s = 0  
  5.     while i < n:  
  6.         s += i  
  7.         i += 1  
  8.     return s  
  9. def for_loop(n=100_000_000):  
  10.     s = 0  
  11.     for i in range(n):  
  12.         s += i 
  13.     return s  
  14. def sum_range(n=100_000_000):  
  15.     return sum(range(n))  
  16. def math_sum(n=100_000_000):  
  17.     return (n * (n - 1)) // 2  
  18. def main():  
  19.     print('while loop\t\t', timeit.timeit(while_loop, number=1))  
  20.     print('for loop\t\t', timeit.timeit(for_loop, number=1))  
  21.     print('sum range\t\t', timeit.timeit(sum_range, number=1))  
  22.     print('math sum\t\t', timeit.timeit(math_sum, number=1))  
  23. if __name__ == '__main__':  
  24.     main()  
  25. # => while loop               4.718853999860585  
  26. # => for loop                 3.211570399813354  
  27. # => sum range                0.8658821999561042  
  28. # => math sum                 2.400018274784088e-06 

最終 math sum 的執行時間約為 2.4e-6,縮短了上百萬倍。這里的思路就是,既然循環的效率低,一段代碼要重復執行上億次。

索性直接不要循環,通過數學公式,把上億次的循環操作變成只有一步操作。效率自然得到了空前的加強。

最后的結論(有點謎語人):

實現循環的最快方式—— —— ——就是不用循環

對于 Python 而言,則盡可能地使用內置函數,將循環中的純 Python 代碼降到最低。 

 

責任編輯:龐桂玉 來源: 菜鳥學Python
相關推薦

2022-06-21 15:00:01

Python語言循環方式

2022-08-18 09:51:50

Python代碼循環

2021-12-09 23:20:31

Python循環語句

2021-03-24 13:17:41

編程循環語句Java

2025-09-26 03:00:00

JSAPIfor 循環

2024-09-26 12:33:29

JSAPI循環

2016-02-17 08:36:05

IT職業

2025-02-21 10:46:16

JSForEachAPI

2023-04-20 13:59:01

Pythonwhile循環的

2018-07-19 08:49:47

Python編程語言測評

2024-04-18 09:16:03

EnumeratePythonFor循環

2020-12-11 05:57:01

Python循環語句代碼

2022-11-04 07:12:24

JavaScript基準測試

2010-09-08 17:00:22

SQLWHILE循環

2024-02-26 12:13:32

C++開發編程

2019-03-22 08:25:20

x86PythonARM

2024-06-19 10:08:42

Python編程while循環

2025-05-07 08:25:02

Android場景驗證碼

2013-03-12 14:07:06

Java編程

2022-01-17 21:08:54

Python 循環結構
點贊
收藏

51CTO技術棧公眾號

97碰碰视频| 欧美精品丝袜中出| 国产成人综合一区二区三区| 中文字幕在线直播| 黑人巨大精品欧美一区二区| 亚洲最大综合网| 国产一区二区三区黄视频 | 六月婷婷综合| 日韩一区二区三区四区五区六区| 伪装者免费全集在线观看| 国产日产欧产精品推荐色| 欧美黄色免费网址| 国产精品主播直播| 视频一区视频二区视频三区视频四区国产 | 国产高清在线精品| 欧美日产一区二区三区在线观看| 91精品国产成人观看| 国产精品香蕉av| 久久福利综合| 亚洲一区国产精品| 在线国产欧美| 日本一区二区三不卡| 玖玖玖国产精品| 性欧美.com| 久久精品国产网站| 夜夜爽www精品| 日韩福利视频导航| 手机成人av在线| 国产成人免费在线视频| 国产精品一线二线三线| 久久久久久免费| baoyu777.永久免费视频| 一区二区久久久| 国产经典视频一区| 亚洲综合一区在线| 精品99又大又爽又硬少妇毛片| 欧美日韩精品二区第二页| 麻豆视频在线播放| 亚洲精品按摩视频| 亚洲欧美专区| 国产精品精品视频一区二区三区| 在线电影一区二区| 亚洲高清123| www日韩大片| 中文字幕在线一二| 欧美成va人片在线观看| 伊人久久大香| 国产精品自拍偷拍| 性久久久久久| 久久久免费视频网站| 日韩伦理精品| 自拍视频国产精品| av资源种子在线观看| 国产精品vip| 色av中文字幕一区| 欧美理论在线观看| 久久久精品五月天| 久久午夜a级毛片| 理论在线观看| 国产人妻777人伦精品hd| 久久综合色综合88| 制服黑丝国产在线| 69av一区二区三区| 亚洲影视资源| 91久久在线播放| 久久狠狠亚洲综合| 快播av资源| 亚洲成人久久网| 欧美**字幕| 一本一道久久a久久精品综合| 国产精品视频在线看| 日本a一级在线免费播放| 亚洲午夜激情免费视频| 精品国产一级毛片| 一本色道久久88亚洲精品综合| 一区在线观看免费| 久草在线资源福利站| 国产欧美韩国高清| 成人avav影音| 欧美69xxx| 欧美性视频精品| 蜜桃精品视频在线| 亚欧精品一区| 亚洲午夜精品视频| 欧美日韩网址| 男女男精品视频站| 亚洲丁香久久久| 欧美少妇xxxx| 久久精品视频16| 这里只有精品视频在线观看| 女人抽搐喷水高潮国产精品| 香蕉精品视频在线| 色哟哟一区二区三区| 99久热这里只有精品视频免费观看| 久久国产主播精品| 亚洲色图第一区| 久久91视频| 日韩欧美一区二区三区四区五区| 亚洲日本成人在线观看| 国产精品伊人| 亚欧精品在线| 91福利资源站| 日韩av专区| 三年中国国语在线播放免费| 亚洲第一国产精品| 欧美一区精品| 国产视频一区二区视频| 女人丝袜激情亚洲| 亚洲精选一区| 香蕉视频色版| 国产精品一香蕉国产线看观看| 欧美猛男gaygay网站| 91网站最新网址| 欧美日韩精品在线一区| 成人网在线视频| 亚洲第一网中文字幕| 欧美精品欧美精品系列| 欧美重口另类| 日本国产亚洲| 精品一区二区三区中文字幕| 日本超碰在线观看| 成人网在线免费视频| av毛片在线看| 成人夜晚看av| 亚洲激情图片小说视频| 美女视频一区| 伊人久久婷婷色综合98网| 欧美在线一区二区| 欧美激情欧美| 91午夜在线| 国产精品高清在线| 依依成人综合视频| 国产欧美日韩在线一区二区| 北条麻妃在线一区| 美女福利视频一区| 久久久久久久久久久电影| 日韩av黄色| 欧美亚洲一二三区| 亚洲视频在线观看视频| 国产综合久久久久影院| 123区在线| 中文字幕一区二区三区四区五区人 | 成人免费毛片嘿嘿连载视频| 91露出在线| 3d动漫精品啪啪一区二区三区免费 | 亚洲无线码在线一区观看| 极品美女销魂一区二区三区| 97在线超碰| 亚洲精品国产suv一区88| 亚洲欧美国产精品| 99re视频精品| 免费萌白酱国产一区二区三区| 国产bdsm| 国产精品乱码| 亚洲国产99精品国自产| 不卡视频一二三四| 欧美日韩大片免费观看| 欧美另类极限扩张| 精品国产_亚洲人成在线| 精品处破学生在线二十三| 成人精品视频一区二区三区 | 黄色在线视频网| 国产91久久婷婷一区二区| 懂色av中文一区二区三区天美 | 99riav一区二区三区| 999精品视频在这里| 桃乃木かなav在线播放| 久久99欧美| 日韩在线观看成人| 亚洲免费av在线| 影音先锋亚洲电影| 亚洲国产福利| 羞羞网www| 日韩免费电影一区二区三区| 色偷偷9999www| 亚洲一区二区三区中文字幕在线| 影音先锋国产精品| 高清亚洲高清| 日本视频一二三区中文字幕| 国产精品国产三级国产专区53 | 欧美激情18p| 日本丶国产丶欧美色综合| 蜜臀av一区二区在线观看 | www.欧美日本| 亚洲一区久久久| 国产亚洲一区二区精品| 夜夜嗨av一区二区三区四季av| 久久夜色精品| 在线视频亚洲专区| 中文字幕资源网在线观看免费 | 国产精品国产a级| 极品尤物久久久av免费看| 中文字幕在线高清| 中文在线最新版天堂8| 日本一区二区三区免费观看| 久久五月天综合| 欧美一区二视频| 亚洲精品久久久蜜桃| 日本私人网站在线观看| av成人综合|