0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python哪種方式循環(huán)最快呢?

新機器視覺 ? 來源:StarryLand ? 2023-04-01 09:32 ? 次閱讀

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

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whileiwhileloop4.718853999860585
#=>forloop3.211570399813354

這是一個簡單的求和操作,計算從 1 到 n 之間所有自然數(shù)的總和??梢钥吹絝or循環(huán)相比while要快 1.5 秒。

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

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

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

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whileiwhileloop4.718853999860585
#=>forloop3.211570399813354
#=>forloopwithincrement4.602369500091299
#=>forloopwithtest4.18337869993411

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

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

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whileiwhileloop4.718853999860585
#=>forloop3.211570399813354
#=>sumrange0.8658821999561042

可以看到,使用內(nèi)置函數(shù)sum替代循環(huán)之后,代碼的執(zhí)行效率實現(xiàn)了成倍的增長。

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

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whileiwhileloop4.718853999860585
#=>forloop3.211570399813354
#=>sumrange0.8658821999561042
#=>mathsum2.400018274784088e-06

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

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

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

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

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





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134088
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078

原文標(biāo)題:Python 哪種方式循環(huán)最快,或許顛覆你的認(rèn)知!

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    一文詳解python循環(huán)

    今天給大家?guī)?b class='flag-5'>python循環(huán)。
    發(fā)表于 10-01 10:48 ?5355次閱讀
    一文詳解<b class='flag-5'>python</b><b class='flag-5'>循環(huán)</b>

    python for循環(huán)

    python for循環(huán)for 循環(huán)可以遍歷任何序列的項目,如一個列表或者一個字符串。它的基本語法是for 元素 in 序列對象:1. 普通循環(huán)直接上案例>>> phones
    發(fā)表于 02-25 16:28

    python while循環(huán)

    python while循環(huán)while 語句用于循環(huán)執(zhí)行程序,即在某條件下,循環(huán)執(zhí)行某段程序,以處理需要重復(fù)處理的相同任務(wù)。其基本形式為:while 判斷條件: 執(zhí)行語句1. 普通的
    發(fā)表于 02-28 16:40

    Python for、while 等循環(huán)速度對比

    的結(jié)論(有點謎語人):實現(xiàn)循環(huán)最快方式—— —— ——就是不用循環(huán)對于 Python 而言,則盡可能地使用內(nèi)置函數(shù),將
    發(fā)表于 03-25 16:05

    python for循環(huán)的案例說明

    python for循環(huán) for 循環(huán)可以遍歷任何序列的項目,如一個列表或者一個字符串。 它的基本語法是 for 元素 in 序列對象: 代碼塊 1. 普通循環(huán) 直接上案例 phone
    的頭像 發(fā)表于 02-25 16:27 ?3030次閱讀

    詳解Python的for和while循環(huán)

    Python 的 for 和 while 循環(huán)是靈活并且高級的,語法自然、讀起來像偽代碼。而 Cython 也支持 for 和 while,無需修改。但由于循環(huán)通常占據(jù)程序運行時的大部分時間,因此我們可以通過一些優(yōu)化,確保 Cy
    的頭像 發(fā)表于 06-24 16:02 ?1393次閱讀

    Python的while循環(huán)是什么

    Python中有2種循環(huán)。一種循環(huán)次數(shù)明確,另一種循環(huán)次數(shù)不明確。`for循環(huán)`的循環(huán)重復(fù)次數(shù)是
    的頭像 發(fā)表于 02-23 11:15 ?1068次閱讀

    Python中的while循環(huán)結(jié)構(gòu)

    Python 中,while 循環(huán)是一種重復(fù)執(zhí)行代碼塊的結(jié)構(gòu),只要指定的條件為 True,就會繼續(xù)執(zhí)行。
    的頭像 發(fā)表于 04-19 15:44 ?1468次閱讀

    Python中的for循環(huán)結(jié)構(gòu)

    Python 中,for 循環(huán)是一種常用的結(jié)構(gòu),用于遍歷序列(如列表、元組、字符串)中的元素。
    的頭像 發(fā)表于 04-19 15:45 ?2046次閱讀

    詳解Python中的while循環(huán)

    說起編程語言中的循環(huán),一般 for 循環(huán)用的時候比較多,因為相比于 while 循環(huán),for 循環(huán)的代碼量更少。不過有時候也會用到 while 循環(huán)
    的頭像 發(fā)表于 04-26 17:55 ?1263次閱讀

    Python循環(huán)語句介紹

    哈嘍大家好,我是知道。今天帶大家了解下Python循環(huán)語句 定義循環(huán)語句允許我們執(zhí)行一個語句或語句組多次 類型Python提供了兩種不同類型的循環(huán)
    的頭像 發(fā)表于 05-11 17:39 ?786次閱讀

    python最簡單for循環(huán)例子

    Python是一種簡單而又強大的編程語言,通過其清晰的語法和豐富的功能庫,我們可以實現(xiàn)各種各樣的任務(wù)。其中一個最基本的語法結(jié)構(gòu)就是for循環(huán),讓我們來看一下如何使用for循環(huán)來編寫一個最簡單的例子
    的頭像 發(fā)表于 11-21 14:53 ?764次閱讀

    python循環(huán)里的輸出結(jié)果匯總

    循環(huán)是計算機編程中常用的一種控制結(jié)構(gòu),用于重復(fù)執(zhí)行一段代碼。Python提供了多種類型的循環(huán)結(jié)構(gòu),包括for循環(huán)和while循環(huán)。在這篇文章
    的頭像 發(fā)表于 11-22 09:59 ?1206次閱讀

    python循環(huán)創(chuàng)建變量并賦值

    循環(huán)Python編程中非常重要的一個概念,它可以讓我們輕松地重復(fù)執(zhí)行某些代碼塊,從而簡化編程過程并提高代碼的效率。在循環(huán)中,我們經(jīng)常需要創(chuàng)建變量并賦值,這是非常常見的操作。接下來,我將詳盡地解釋在
    的頭像 發(fā)表于 11-23 14:51 ?1356次閱讀

    python怎么設(shè)置循環(huán)次數(shù)

    Python中,可以使用循環(huán)語句來重復(fù)執(zhí)行一段代碼多次。要設(shè)置循環(huán)次數(shù),可以使用循環(huán)的計數(shù)器來控制循環(huán)的執(zhí)行次數(shù)。以下是幾種常用的設(shè)置
    的頭像 發(fā)表于 11-23 15:50 ?3769次閱讀