眾所周知,Python 不是一種執行效率較高的語言。此外在任何語言中,循環都是一種非常消耗時間的操作。假如任意一種簡單的單步操作耗費的時間為 1 個單位,將此操作重復執行上萬次,最終耗費的時間也將增長上萬倍。
while和for是 Python 中常用的兩種實現循環的關鍵字,它們的運行效率實際上是有差距的。比如下面的測試代碼:
importtimeit defwhile_loop(n=100_000_000): i=0 s=0 whileiwhileloop4.718853999860585 #=>forloop3.211570399813354
這是一個簡單的求和操作,計算從 1 到 n 之間所有自然數的總和。可以看到for循環相比while要快 1.5 秒。
其中的差距主要在于兩者的機制不同。
在每次循環中,while實際上比for多執行了兩步操作:邊界檢查和變量i的自增。即每進行一次循環,while 都會做一次邊界檢查 (while i < n)和自增計算(i +=1)。這兩步操作都是顯式的純 Python 代碼。
for循環不需要執行邊界檢查和自增操作,沒有增加顯式的 Python 代碼(純 Python 代碼效率低于底層的 C 代碼)。當循環的次數足夠多,就出現了明顯的效率差距。
可以再增加兩個函數,在for循環中加上不必要的邊界檢查和自增計算:
importtimeit defwhile_loop(n=100_000_000): i=0 s=0 whileiwhileloop4.718853999860585 #=>forloop3.211570399813354 #=>forloopwithincrement4.602369500091299 #=>forloopwithtest4.18337869993411
可以看出,增加的邊界檢查和自增操作確實大大影響了for循環的執行效率。
前面提到過,Python 底層的解釋器和內置函數是用 C 語言實現的。而 C 語言的執行效率遠大于 Python。
對于上面的求等差數列之和的操作,借助于 Python 內置的sum函數,可以獲得遠大于for或while循環的執行效率。
importtimeit defwhile_loop(n=100_000_000): i=0 s=0 whileiwhileloop4.718853999860585 #=>forloop3.211570399813354 #=>sumrange0.8658821999561042
可以看到,使用內置函數sum替代循環之后,代碼的執行效率實現了成倍的增長。
內置函數sum的累加操作實際上也是一種循環,但它由 C 語言實現,而for循環中的求和操作是由純 Python 代碼s += i實現的。C > Python。
再拓展一下思維。小時候都聽說過童年高斯巧妙地計算 1 到 100 之和的故事。1…100 之和等于 (1 + 100) * 50。這個計算方法同樣可以應用到上面的求和操作中。
importtimeit defwhile_loop(n=100_000_000): i=0 s=0 whileiwhileloop4.718853999860585 #=>forloop3.211570399813354 #=>sumrange0.8658821999561042 #=>mathsum2.400018274784088e-06
最終 math sum 的執行時間約為2.4e-6,縮短了上百萬倍。這里的思路就是,既然循環的效率低,一段代碼要重復執行上億次。
索性直接不要循環,通過數學公式,把上億次的循環操作變成只有一步操作。效率自然得到了空前的加強。
最后的結論(有點謎語人):
實現循環的最快方式—— —— ——就是不用循環
對于 Python 而言,則盡可能地使用內置函數,將循環中的純 Python 代碼降到最低。
審核編輯:劉清
-
C語言
+關注
關注
180文章
7614瀏覽量
137712 -
python
+關注
關注
56文章
4807瀏覽量
85037
原文標題:Python 哪種方式循環最快,或許顛覆你的認知!
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論