91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

python爬蟲知識(shí)分享 ? 來(lái)源:python爬蟲知識(shí)分享 ? 作者:python爬蟲知識(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í)行邊界檢查和自增操作,沒有增加顯式的 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í)候都聽說(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)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    9

    文章

    6216

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74009
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90078
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)鍵字volatile的含意

    關(guān)鍵字volatile有什么含意? 一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心
    發(fā)表于 12-23 06:33

    interrupt關(guān)鍵字使用

    中斷是嵌入式系統(tǒng)重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一擴(kuò)展—讓標(biāo)準(zhǔn)C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字__interrupt。下面的代碼就使用了__interrupt關(guān)鍵字
    發(fā)表于 12-22 09:36

    Temu跨境電商按關(guān)鍵字搜索Temu商品API的應(yīng)用及接口請(qǐng)求示例

    Temu跨境電商按關(guān)鍵字搜索Temu商品API的應(yīng)用及接口請(qǐng)求示例 Temu跨境電商按關(guān)鍵字搜索Temu商品API的應(yīng)用場(chǎng)景 Temu跨境電商平臺(tái)按關(guān)鍵字搜索Temu商品API的主要應(yīng)用場(chǎng)景包括但不
    的頭像 發(fā)表于 11-29 15:08 ?479次閱讀

    哪些場(chǎng)合會(huì)用到volatile關(guān)鍵字?

    當(dāng)你理解 volatile關(guān)鍵字的含義之后,你就能明白,其實(shí)很多場(chǎng)合都能用到 volatile關(guān)鍵字。 1.全局變量單片機(jī)開發(fā),難免會(huì)用到全局變量。一些初級(jí)工程師,更是全局變量滿天飛。這種情況下
    發(fā)表于 11-25 08:19

    天眼查平臺(tái)關(guān)鍵字搜索企業(yè)數(shù)據(jù)API接口技術(shù)指南

    ? 一、接口概述 天眼查提供的企業(yè)搜索API接口,支持通過(guò)關(guān)鍵字查詢企業(yè)工商信息、經(jīng)營(yíng)狀態(tài)等核心數(shù)據(jù)。該接口采用RESTful架構(gòu),返回JSON格式數(shù)據(jù)。 二、接口認(rèn)證 調(diào)用需使用API密鑰認(rèn)證
    的頭像 發(fā)表于 11-21 11:48 ?724次閱讀
    天眼查平臺(tái)<b class='flag-5'>關(guān)鍵字</b>搜索企業(yè)數(shù)據(jù)API接口技術(shù)指南

    咸魚平臺(tái)商品關(guān)鍵字搜索API接口設(shè)計(jì)與實(shí)現(xiàn)

    ) sort:排序方式(可選:price_asc, price_desc, time_desc) 二、技術(shù)實(shí)現(xiàn)方案 核心邏輯 : 關(guān)鍵詞分詞處理 多字段匹配(標(biāo)題/描述/標(biāo)簽) 結(jié)果排序與分頁(yè)
    的頭像 發(fā)表于 11-19 15:32 ?277次閱讀
    咸魚平臺(tái)商品<b class='flag-5'>關(guān)鍵字</b>搜索API接口設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    用PLC實(shí)現(xiàn)卷徑計(jì)算的兩種算法

    卷徑計(jì)算,是動(dòng)態(tài)計(jì)算如鋼卷,紙卷等存料量的一方法,它是實(shí)現(xiàn)張力控制和自動(dòng)充放料、以及甩尾控制的重要前提。卷徑計(jì)算目前主流的方法有兩種,一是根據(jù)機(jī)列速度(產(chǎn)線速度)和和被測(cè)卷的轉(zhuǎn)動(dòng)角
    的頭像 發(fā)表于 11-14 16:54 ?2110次閱讀
    用PLC<b class='flag-5'>實(shí)現(xiàn)</b>卷徑計(jì)算的<b class='flag-5'>兩種</b>算法

    1688平臺(tái)關(guān)鍵字搜索商品API接口技術(shù)實(shí)踐指南

    /com.alibaba.product/alibaba.product.search/ 必備參數(shù): { "keyword": "手機(jī)", // 搜索關(guān)鍵字 "pageNo": 1, // 頁(yè)碼 "pageSize": 20, // 每頁(yè)數(shù)量 "access_token": "xxx" // 認(rèn)證令牌 } 二、響應(yīng)
    的頭像 發(fā)表于 11-11 14:22 ?564次閱讀
    1688平臺(tái)<b class='flag-5'>關(guān)鍵字</b>搜索商品API接口技術(shù)實(shí)踐指南

    亞馬遜平臺(tái)根據(jù)關(guān)鍵字搜索商品API接口

    ? ?在電商開發(fā),集成亞馬遜平臺(tái)的商品搜索功能是常見需求。通過(guò)亞馬遜的Product Advertising API(PAAPI),開發(fā)者可以根據(jù)關(guān)鍵字高效檢索商品信息。本技術(shù)帖將逐步介紹如何調(diào)用
    的頭像 發(fā)表于 11-05 15:00 ?382次閱讀
    亞馬遜平臺(tái)根據(jù)<b class='flag-5'>關(guān)鍵字</b>搜索商品API接口

    亞馬遜 SP-API 深度開發(fā):關(guān)鍵字搜索接口的購(gòu)物意圖挖掘與合規(guī)競(jìng)品分析

    本文深度解析亞馬遜SP-API關(guān)鍵字搜索接口的合規(guī)調(diào)用與商業(yè)應(yīng)用,涵蓋意圖識(shí)別、競(jìng)品分析、性能優(yōu)化全鏈路。通過(guò)COSMO算法解析用戶購(gòu)物意圖,結(jié)合合規(guī)技術(shù)方案提升關(guān)鍵詞轉(zhuǎn)化率,助力賣家實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)決策,安全高效優(yōu)化運(yùn)營(yíng)。
    的頭像 發(fā)表于 10-17 14:59 ?580次閱讀

    阿里巴巴國(guó)際站關(guān)鍵字搜索 API 實(shí)戰(zhàn):從多條件篩選到商品列表高效獲客

    ??在跨境電商數(shù)據(jù)采集場(chǎng)景,通過(guò)關(guān)鍵字精準(zhǔn)搜索商品列表是基礎(chǔ)且核心的需求。本文將聚焦阿里巴巴國(guó)際站的關(guān)鍵字搜索接口,詳細(xì)介紹如何構(gòu)建多條件搜索請(qǐng)求、處理分頁(yè)數(shù)據(jù)、解析商品列表信息,并提供可直接復(fù)用的
    的頭像 發(fā)表于 08-20 09:22 ?961次閱讀
    阿里巴巴國(guó)際站<b class='flag-5'>關(guān)鍵字</b>搜索 API 實(shí)戰(zhàn):從多條件篩選到商品列表高效獲客

    micro 關(guān)鍵字搜索全覆蓋商品,并通過(guò) API 接口提供實(shí)時(shí)數(shù)據(jù)

    micro 關(guān)鍵字搜索全覆蓋商品”并通過(guò) API 接口提供實(shí)時(shí)數(shù)據(jù)
    的頭像 發(fā)表于 07-13 10:13 ?892次閱讀

    貼片晶振兩種常見封裝介紹

    貼片晶體振蕩器作為關(guān)鍵的時(shí)鐘頻率元件,其性能直接關(guān)系到系統(tǒng)運(yùn)行的穩(wěn)定性。今天,凱擎小妹帶大家聊聊貼片晶振兩種常見封裝——金屬面封裝與陶瓷面封裝。
    的頭像 發(fā)表于 07-04 11:29 ?1277次閱讀
    貼片晶振<b class='flag-5'>中</b><b class='flag-5'>兩種</b>常見封裝介紹

    基礎(chǔ)篇3:掌握Python的條件語(yǔ)句與循環(huán)

    不同的條件執(zhí)行不同的代碼塊。Python的條件語(yǔ)句主要使用if、elif(else if的縮寫)和else關(guān)鍵字。 if語(yǔ)句 最簡(jiǎn)單的條件語(yǔ)句是if語(yǔ)句,它的工作方式如下: 復(fù)制代碼 if 條件表達(dá)式
    發(fā)表于 07-03 16:13

    單片機(jī)編程關(guān)鍵字之volatile

    volatile 修飾的變量是說(shuō)這變量可能會(huì)被意想不到地改變。通常對(duì)于程序員而言,單片機(jī) 中用的就算常見了volatile 是易變的,不穩(wěn)定的意思。其實(shí)對(duì)于很多人來(lái)說(shuō),根本沒見過(guò)這個(gè)關(guān)鍵字,不 知道
    發(fā)表于 04-02 13:47 ?2次下載