色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解Python中兩種實現循環的關鍵字

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-25 16:04 ? 次閱讀

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

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

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s

def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s

def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))

if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => 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 循環中加上不必要的邊界檢查和自增計算:

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s

def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s

def for_loop_with_inc(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
        i += 1
    return s

def for_loop_with_test(n=100_000_000):
    s = 0
    for i in range(n):
        if i < n:
            pass
        s += i
    return s

def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('for loop with increment\t\t',
          timeit.timeit(for_loop_with_inc, number=1))
    print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=1))

if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => for loop with increment          4.602369500091299
# => for loop with test               4.18337869993411

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

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

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

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s

def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s

def sum_range(n=100_000_000):
    return sum(range(n))

def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('sum range\t\t', timeit.timeit(sum_range, number=1))

if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => sum range                0.8658821999561042

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

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

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

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s

def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s

def sum_range(n=100_000_000):
    return sum(range(n))

def math_sum(n=100_000_000):
    return (n * (n - 1)) // 2

def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('sum range\t\t', timeit.timeit(sum_range, number=1))
    print('math sum\t\t', timeit.timeit(math_sum, number=1))

if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => sum range                0.8658821999561042
# => math sum                 2.400018274784088e-06

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

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

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

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

對于 Python 而言,則盡可能地使用內置函數,將循環中的純 Python 代碼降到最低。
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 測試
    +關注

    關注

    8

    文章

    5278

    瀏覽量

    126603
  • 代碼
    +關注

    關注

    30

    文章

    4780

    瀏覽量

    68529
  • python
    +關注

    關注

    56

    文章

    4792

    瀏覽量

    84630
收藏 人收藏

    評論

    相關推薦

    C語言關鍵字分別發生在哪個階段

    以下C語言關鍵字,分別發生在哪個階段? 第一個,define。 首先得糾正一下,define 并不是C語言里面的關鍵字,即使加了井號,也不是。 define 屬于C語言的預處理指令,很顯然,它發生
    的頭像 發表于 11-24 10:31 ?171次閱讀

    噪聲傳導的兩種模式

    噪聲傳導有兩種模式,一為差模傳導,一為共模傳導。
    的頭像 發表于 10-15 11:33 ?283次閱讀
    噪聲傳導的<b class='flag-5'>兩種</b>模式

    C語言關鍵字--typedef

    C語言關鍵字使用方法學習指南!
    的頭像 發表于 10-07 12:44 ?243次閱讀

    使用邊緣AI和Sitara處理器進行關鍵字檢測

    電子發燒友網站提供《使用邊緣AI和Sitara處理器進行關鍵字檢測.pdf》資料免費下載
    發表于 09-02 11:30 ?0次下載
    使用邊緣AI和Sitara處理器進行<b class='flag-5'>關鍵字</b>檢測

    typedef struct和直接struct的區別

    在C語言中, typedef 和 struct 是兩種不同的關鍵字,它們在定義和使用上有著明顯的區別。 typedef struct 和直接 struct 在 C 語言中用于定義結構體類型,但它們在
    的頭像 發表于 08-20 10:58 ?2718次閱讀

    快速掌握C語言關鍵字

    C語言中的32個關鍵字你知道多少個呢?根據關鍵字的作用分為四類:數據類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它
    的頭像 發表于 07-06 08:04 ?339次閱讀
    快速掌握C語言<b class='flag-5'>關鍵字</b>

    控制器有哪兩種實現方式?各有何優缺點?

    控制器是計算機系統的一個關鍵組件,負責協調和管理計算機硬件和軟件資源。在不同的應用場景和系統,控制器的實現方式可能會有所不同。以下是兩種
    的頭像 發表于 06-30 10:33 ?1215次閱讀

    伺服電機與步進電機|兩種電機的關鍵區別

    ? ? ? 在自動化控制的世界,伺服電機和步進電機是實現精準動力傳輸的關鍵角色。雖然它們的終極目標相同,即精確控制機械運動,但它們的工作原理和最佳應用場景卻有所不同。本文將帶你了
    的頭像 發表于 06-17 16:21 ?887次閱讀
    伺服電機與步進電機|<b class='flag-5'>兩種</b>電機的<b class='flag-5'>關鍵</b>區別

    PCBA加工中常見的兩種焊接方式詳解

    一站式PCBA智造廠家今天為大家講講PCBA加工手工焊接有哪幾種方式?PCBA加工過程中常用焊接方式。在PCBA(印刷電路板組裝)加工過程,焊接是一個關鍵的步驟。而手工焊接作為一常見的焊接方式
    的頭像 發表于 06-14 09:18 ?537次閱讀

    溫度沖擊與溫度循環:揭示材料失效的兩種溫度試驗方法

    溫度沖擊試驗與溫度循環試驗,雖然都是對材料或產品進行溫度應力測試的方法,但它們的應力負荷機理存在顯著差異。簡單來說,溫度沖擊主要關注蠕變及疲勞損傷導致的失效,而溫度循環則更多地考察由剪切疲勞所引發的失效。這兩種試驗在試驗環境、取
    的頭像 發表于 04-18 15:07 ?979次閱讀
    溫度沖擊與溫度<b class='flag-5'>循環</b>:揭示材料失效的<b class='flag-5'>兩種</b>溫度試驗方法

    關鍵字搜索文件夾某個TXT文件

    文件夾隨時創造TXT文件,如何及時選出剛創造的文件?或關鍵字搜索出需要的TXT文件?
    發表于 02-06 15:22

    異或門兩種常見的實現方式

    兩種實現方式都能夠實現異或門的功能,具體的選擇取決于設計需求和邏輯門的可用性。實際構建異或門時,可以使用離散電子元件(如晶體管、二極管等)或整合電路芯片(如 TTL、CMOS 等)來實現
    的頭像 發表于 02-04 17:30 ?1.2w次閱讀
    異或門<b class='flag-5'>兩種</b>常見的<b class='flag-5'>實現</b>方式

    在NVM和本地\"內存定義數組(靜態 /global /local)的\"關鍵字是什么?

    在 NVM 和本地\"內存定義數組(靜態 /global /local)的\"關鍵字是什么? 還有與 32 位對齊的關鍵字怎么樣。
    發表于 01-25 07:52

    加速Python for循環的12方法

    Python內建的一個常用功能是timeit模塊。下面幾節我們將使用它來度量循環的當前性能和改進后的性能。
    的頭像 發表于 01-04 17:33 ?1941次閱讀
    加速<b class='flag-5'>Python</b> for<b class='flag-5'>循環</b>的12<b class='flag-5'>種</b>方法

    探討多線程編程的volatile關鍵字應用

    有時候,我們可能需要在指針類型之間進行轉換,而編譯器會認為這是不安全的操作,從而導致編譯錯誤。使用volatile關鍵字可以告知編譯器,這個類型轉換是有意義的,不應該引發錯誤。
    發表于 12-27 13:53 ?454次閱讀
    主站蜘蛛池模板: 久久6699精品国产人妻| 天天久久狠狠色综合| 亚洲欧美成人无码久久久| 菠萝菠萝蜜视频在线看1| 久久伊人青青| 亚洲AV色香蕉一区二区9255| 被爽到叫呻呤视频免费视频| 久久综合色一综合色88| 亚洲成A人片在线观看中文不卡| 快播电影网站大全| 亚洲 欧美 日本 国产 高清| 成人国产三级在线播放| 老熟女重囗味HDXX| 亚洲精品高清AV在线播放| 国产AV果冻传奇麻豆| 欧美日韩亚洲成人| 18av 在线| 久久精品亚洲AV中文2区金莲| 小sao货ji巴cao死你视频| 大香伊蕉在人线国产97| 嫩草影院精品视频在线观看| 玉林天天论坛| 久久er国产精品免费观看2| 学校女性奴sm训练调教| 丰满少妇67194视频| 破苞流血哭泣 magnet| 97国内精品久久久久久久影视| 久久电影午夜| 亚洲手机在线人成视频| 国产在线视频一区二区不卡| 无人影院在线播放视频| 丰满的女朋友韩国版在线观看| 欧洲美女高清一级毛片| 99精品欧美一区二区三区美图| 玖玖爱在线播放| 御姐被吸奶| 乱辈通奷XXXXXHD猛交| 2022国产91精品久久久久久| 久久亚洲精品永久网站| 中文字幕在线永久| 麻豆出品国产AV在线观看|