在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

詳解Python中兩種實(shí)現(xiàn)循環(huán)的關(guān)鍵字

python爬蟲(chóng)知識(shí)分享 ? 來(lái)源:python爬蟲(chóng)知識(shí)分享 ? 作者:python爬蟲(chóng)知識(shí)分享 ? 2022-03-25 16:04 ? 次閱讀

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

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

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

這是一個(gè)簡(jiǎn)單的求和操作,計(jì)算從 1 到 n 之間所有自然數(shù)的總和。可以看到 for 循環(huán)相比 while 要快 1.5 秒。

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

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

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

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

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

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

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

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

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

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

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

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

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 的執(zhí)行時(shí)間約為 2.4e-6,縮短了上百萬(wàn)倍。這里的思路就是,既然循環(huán)的效率低,一段代碼要重復(fù)執(zhí)行上億次。

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

最后的結(jié)論(有點(diǎn)謎語(yǔ)人):

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

對(duì)于 Python 而言,則盡可能地使用內(nèi)置函數(shù),將循環(huán)中的純 Python 代碼降到最低。
審核編輯:湯梓紅

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

    關(guān)注

    8

    文章

    5399

    瀏覽量

    127128
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4837

    瀏覽量

    69128
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4811

    瀏覽量

    85076
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言關(guān)鍵字分別發(fā)生在哪個(gè)階段

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

    Python多線程和多進(jìn)程的區(qū)別

    Python作為一高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python多線
    的頭像 發(fā)表于 10-23 11:48 ?503次閱讀
    <b class='flag-5'>Python</b><b class='flag-5'>中</b>多線程和多進(jìn)程的區(qū)別

    噪聲傳導(dǎo)的兩種模式

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

    C語(yǔ)言關(guān)鍵字--typedef

    C語(yǔ)言關(guān)鍵字使用方法學(xué)習(xí)指南!
    的頭像 發(fā)表于 10-07 12:44 ?350次閱讀

    Linux應(yīng)用層控制外設(shè)的兩種不同的方式

    眾所周知,linux下一切皆文件,那么應(yīng)用層如何控制硬件層,同樣是通過(guò) 文件I/O的方式來(lái)實(shí)現(xiàn)的,那么應(yīng)用層控制硬件層通常有兩種方式。
    的頭像 發(fā)表于 10-05 19:03 ?736次閱讀
    Linux應(yīng)用層控制外設(shè)的<b class='flag-5'>兩種</b>不同的方式

    使用邊緣AI和Sitara處理器進(jìn)行關(guān)鍵字檢測(cè)

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

    typedef struct和直接struct的區(qū)別

    在C語(yǔ)言中, typedef 和 struct 是兩種不同的關(guān)鍵字,它們?cè)诙x和使用上有著明顯的區(qū)別。 typedef struct 和直接 struct 在 C 語(yǔ)言中用于定義結(jié)構(gòu)體類(lèi)型,但它們?cè)?/div>
    的頭像 發(fā)表于 08-20 10:58 ?3132次閱讀

    wdm設(shè)備的兩種傳輸方式

    系統(tǒng),有多種傳輸方式,其中最常見(jiàn)的兩種是密集波分復(fù)用(DWDM)和粗波分復(fù)用(CWDM)。 1. 密集波分復(fù)用(DWDM) 1.1 DWDM技術(shù)原理 密集波分復(fù)用(Dense Wavelength Division Multiplexing,簡(jiǎn)稱(chēng)DWDM)是一
    的頭像 發(fā)表于 07-18 09:45 ?557次閱讀

    快速掌握C語(yǔ)言關(guān)鍵字

    C語(yǔ)言中的32個(gè)關(guān)鍵字你知道多少個(gè)呢?根據(jù)關(guān)鍵字的作用分為四類(lèi):數(shù)據(jù)類(lèi)型關(guān)鍵字、控制語(yǔ)句關(guān)鍵字、存儲(chǔ)類(lèi)型關(guān)鍵字和其它
    的頭像 發(fā)表于 07-06 08:04 ?430次閱讀
    快速掌握C語(yǔ)言<b class='flag-5'>關(guān)鍵字</b>

    控制器有哪兩種實(shí)現(xiàn)方式?各有何優(yōu)缺點(diǎn)?

    控制器是計(jì)算機(jī)系統(tǒng)的一個(gè)關(guān)鍵組件,負(fù)責(zé)協(xié)調(diào)和管理計(jì)算機(jī)硬件和軟件資源。在不同的應(yīng)用場(chǎng)景和系統(tǒng),控制器的實(shí)現(xiàn)方式可能會(huì)有所不同。以下是兩種
    的頭像 發(fā)表于 06-30 10:33 ?1501次閱讀

    伺服電機(jī)與步進(jìn)電機(jī)|兩種電機(jī)的關(guān)鍵區(qū)別

    ? ? ? 在自動(dòng)化控制的世界,伺服電機(jī)和步進(jìn)電機(jī)是實(shí)現(xiàn)精準(zhǔn)動(dòng)力傳輸?shù)?b class='flag-5'>兩個(gè)關(guān)鍵角色。雖然它們的終極目標(biāo)相同,即精確控制機(jī)械運(yùn)動(dòng),但它們的工作原理和最佳應(yīng)用場(chǎng)景卻有所不同。本文將帶你了
    的頭像 發(fā)表于 06-17 16:21 ?1057次閱讀
    伺服電機(jī)與步進(jìn)電機(jī)|<b class='flag-5'>兩種</b>電機(jī)的<b class='flag-5'>關(guān)鍵</b>區(qū)別

    PCBA加工中常見(jiàn)的兩種焊接方式詳解

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

    溫度沖擊與溫度循環(huán):揭示材料失效的兩種溫度試驗(yàn)方法

    溫度沖擊試驗(yàn)與溫度循環(huán)試驗(yàn),雖然都是對(duì)材料或產(chǎn)品進(jìn)行溫度應(yīng)力測(cè)試的方法,但它們的應(yīng)力負(fù)荷機(jī)理存在顯著差異。簡(jiǎn)單來(lái)說(shuō),溫度沖擊主要關(guān)注蠕變及疲勞損傷導(dǎo)致的失效,而溫度循環(huán)則更多地考察由剪切疲勞所引發(fā)的失效。這兩種試驗(yàn)在試驗(yàn)環(huán)境、取
    的頭像 發(fā)表于 04-18 15:07 ?1118次閱讀
    溫度沖擊與溫度<b class='flag-5'>循環(huán)</b>:揭示材料失效的<b class='flag-5'>兩種</b>溫度試驗(yàn)方法

    淺析多晶硅錠位錯(cuò)存在的兩種來(lái)源

    根據(jù)晶體凝固生長(zhǎng)與位錯(cuò)形成、運(yùn)動(dòng)與增殖的理論,多晶硅錠位錯(cuò)存在兩種來(lái)源:原生和增殖。
    的頭像 發(fā)表于 03-27 11:09 ?623次閱讀
    淺析多晶硅錠<b class='flag-5'>中</b>位錯(cuò)存在的<b class='flag-5'>兩種</b>來(lái)源

    verilogfunction和task的區(qū)別

    在Verilog,F(xiàn)unction和Task是用于模塊化設(shè)計(jì)和重用代碼的兩種重要元素。它們?cè)试S開(kāi)發(fā)人員將復(fù)雜的操作分解為更小的功能單元,并在需要時(shí)調(diào)用它們。雖然Function和Task在某些方面
    的頭像 發(fā)表于 02-22 15:40 ?2055次閱讀
    主站蜘蛛池模板: 五月天丁香婷 | 中文字幕一二三四区2021 | 激情综合激情五月 | 久热久热| 精品一区二区三区自拍图片区 | 高清视频一区 | 视频一二三区 | 狠狠色伊人亚洲综合第8页 狠狠色依依成人婷婷九月 狠狠色影院 | 可以直接看的黄色网址 | 日本黄网站高清色大全 | 伦理片日本韩国电影三级在线观看 | 久久婷婷成人综合色 | 亚洲好骚综合 | 亚洲最色网站 | 色免费在线 | 夜间免费小视频 | 天天干天天插 | 日本aaaaa高清免费看 | 日本三级特黄 | 一本大道一卡二卡四卡 | 免费日本黄色网址 | 国产精品看片 | 这里只有精品视频 | 免费色网址 | 久久免费看 | 日本黄色网址视频 | 欧美日韩亚洲一区 | 狠狠狠色丁香婷婷综合久久五月 | 欧美一区二区高清 | 噜噜爽 | 久久精品隔壁老王影院 | 一区二区三区四区免费视频 | 一级a毛片免费观看 | 一级特色黄色片 | 一级女性黄 色生活片 | 日本毛片在线观看 | 国产h在线播放 | 奇米一区二区三区四区久久 | 日本高清一本视频 | 天天噜噜日日噜噜久久综合网 | 国产成人亚洲精品77 |