成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 [[438704]]

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

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

  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 循環(huán)相比 while 要快 1.5 秒。

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

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

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

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

  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 循環(huán)的執(zhí)行效率。

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

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

  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 替代循環(huán)之后,代碼的執(zhí)行效率實現了成倍的增長。

內置函數 sum 的累加操作實際上也是一種循環(huán),但它由 C 語言實現,而 for 循環(huán)中的求和操作是由純 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 的執(zhí)行時間約為 2.4e-6,縮短了上百萬倍。這里的思路就是,既然循環(huán)的效率低,一段代碼要重復執(zhí)行上億次。

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

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

實現循環(huán)的最快方式—— —— ——就是不用循環(huán)

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

 

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

2022-06-21 15:00:01

Python語言循環(huán)方式

2022-08-18 09:51:50

Python代碼循環(huán)

2024-09-26 12:33:29

JSAPI循環(huán)

2016-02-17 08:36:05

IT職業(yè)

2021-12-09 23:20:31

Python循環(huán)語句

2025-02-21 10:46:16

JSForEachAPI

2023-04-20 13:59:01

Pythonwhile循環(huán)的

2021-03-24 13:17:41

編程循環(huán)語句Java

2018-07-19 08:49:47

Python編程語言測評

2020-12-11 05:57:01

Python循環(huán)語句代碼

2024-04-18 09:16:03

EnumeratePythonFor循環(huán)

2022-11-04 07:12:24

JavaScript基準測試

2010-09-08 17:00:22

SQLWHILE循環(huán)

2024-06-19 10:08:42

Python編程while循環(huán)

2019-03-22 08:25:20

x86PythonARM

2024-02-26 12:13:32

C++開發(fā)編程

2025-05-07 08:25:02

Android場景驗證碼

2013-03-12 14:07:06

Java編程

2011-08-10 08:56:27

Chrome瀏覽器

2020-06-18 12:23:05

WiFi速度5G
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产91久久久久游泳池 | 亚洲高清视频在线 | 天天干在线播放 | 99久久精品免费 | 国产精品久久久久久久久久久久冷 | 97精品国产97久久久久久免费 | 一区二区三区日韩 | av一二三区| 日本久久网 | 超级乱淫av片免费播放 | av中文网 | 国内自拍偷拍 | 国产一区欧美 | 成人在线观看欧美 | 一区二区三区中文字幕 | 欧美综合一区 | 亚洲综合字幕 | 精品久久久久久久人人人人传媒 | 在线观看免费av网 | 在线一级片 | 欧美精品久久久久久 | 亚洲国产高清高潮精品美女 | 欧美一区2区三区4区公司二百 | www.日日夜夜| 久综合| 久久骚| 手机看黄av免费网址 | 免费观看一级特黄欧美大片 | 伊色综合久久之综合久久 | 午夜精品视频在线观看 | 视频在线观看一区 | 国产黄色大片在线免费观看 | 国产精品美女久久久久久久网站 | www.蜜桃av | 国产精品久久久久久久免费观看 | 91久久电影 | 国产精品亚洲一区二区三区在线 | 天天操 夜夜操 | 日韩午夜一区二区三区 | 亚洲欧美精品在线观看 | 91在线资源 |