久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > Python自定義計(jì)時(shí)函數(shù)

        Python自定義計(jì)時(shí)函數(shù)

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-07 20:20:47 1699359647

        python標(biāo)準(zhǔn)庫提供的cProfile/profile模塊,計(jì)時(shí)輸出信息較多。本節(jié)將介紹其他幾種精度略低但簡單易用的計(jì)時(shí)工具。根據(jù)代碼粒度不同,將其分為三類。

        1.1整個(gè)程序計(jì)時(shí)

        Unix/Linux系統(tǒng)中,可用time命令簡單地統(tǒng)計(jì)整個(gè)程序的耗時(shí)。例如:

        [wangxiaoyuan_@localhostPyTest]$timepythonBCLineCounter.pybulk

        FileLinesCodeLinesCommentLinesEmptyLinesCommentPercent

        1545010437326425380.24

        real0m2.803s

        user0m1.124s

        sys0m0.052s

        統(tǒng)計(jì)值real表示程序運(yùn)行的實(shí)際耗時(shí),user表示程序執(zhí)行用戶態(tài)代碼(內(nèi)核外)耗費(fèi)的CPU時(shí)間,sys表示程序在內(nèi)核態(tài)運(yùn)行所耗費(fèi)的CPU時(shí)間(即調(diào)用特定內(nèi)核函數(shù)的耗時(shí))。若user和sys時(shí)間之和小于real時(shí)間,表明程序?yàn)镮/O密集型(I/Obound),即程序的性能問題很可能與等待I/O有關(guān)。

        time命令的詳細(xì)描述參見《Linux用戶態(tài)程序計(jì)時(shí)方式詳解》。

        1.2代碼片段計(jì)時(shí)

        代碼片段計(jì)時(shí)分為函數(shù)計(jì)時(shí)和語句塊計(jì)時(shí)。這兩種計(jì)時(shí)均可使用Python標(biāo)準(zhǔn)庫timeit模塊,該模塊的詳細(xì)介紹參見官方幫助。

        本小節(jié)將使用timeit模塊的timeit()方法,即timeit(stmt='pass',setup='pass',timer=,number=1000000)。其中,參數(shù)stmt為待計(jì)時(shí)的目標(biāo)代碼;setup為執(zhí)行代碼的準(zhǔn)備工作(通常是import之類的語句),不計(jì)入時(shí)間;timer在Windows系統(tǒng)中為time.clock(),Linux系統(tǒng)中則為time.time(),取默認(rèn)值即可;number指示stmt重復(fù)執(zhí)行的次數(shù)。該方法返回執(zhí)行stmt代碼number遍所用的時(shí)間,單位為秒,float類型。

        除timeit()方法外,對(duì)于特定函數(shù)的計(jì)時(shí),可使用裝飾器(decorator);對(duì)于語句塊計(jì)時(shí),則可使用上下文管理器(contextmanager)。

        以裝飾器為例:

        importfunctools,sys,time

        defFuncTimer(repeats=10000):

        defdecorator(func):

        @functools.wraps(func)

        defwrapper(*args,**kwargs):

        #Windows系統(tǒng)中clock()粒度為毫秒,time()粒度為1/60秒;

        #Unix系統(tǒng)中clock()粒度為1/100秒,time()精度較其更高。

        ifsys.platform=="win32":

        timerFunc=time.clock

        else:

        timerFunc=time.time

        try:

        startTime=timerFunc()

        foriinrange(repeats):

        ret=func(*args,**kwargs)

        finally:#當(dāng)目標(biāo)函數(shù)發(fā)生異常時(shí),仍舊輸出計(jì)時(shí)信息

        endTime=timerFunc()

        print'%s.%s()=>'%(func.__module__,func.__name__),

        print'TimeElasped:%.3fmsec,repeated%dtime(s).'\

        %(((endTime-startTime)*1000.0),repeats)

        returnret

        returnwrapper

        returndecorator

        運(yùn)行如下代碼,對(duì)比自定義裝飾器FuncTimer與timeit模塊計(jì)時(shí)效果:

        @FuncTimer(10)

        defDecoratedFunc():

        L=[]

        foriinrange(100):L.append(i)

        defRawFunc():

        L=[]

        foriinrange(100):L.append(i)

        DecoratedFunc()

        importtimeit;print'%.6fsec'%timeit.timeit(stmt=RawFunc,number=10)

        輸出如下:

        __main__.DecoratedFunc()=>TimeElasped:0.164msec,repeated10time(s).

        0.000174sec

        可見,計(jì)時(shí)效果非常接近。

        注意,F(xiàn)uncTimer裝飾器內(nèi)根據(jù)系統(tǒng)選用不同的計(jì)時(shí)器,這是考慮到time.clock()的精度因系統(tǒng)平臺(tái)而異。在Unix/Linux系統(tǒng)中,該方法返回當(dāng)前所耗的CPU時(shí)間;而在Windows系統(tǒng)中,該方法基于Win32函數(shù)QueryPerformanceCounter(),返回從首次調(diào)用待計(jì)時(shí)函數(shù)起所經(jīng)歷的掛鐘時(shí)間(wallclocktime),精度較time.time()更高。相比而言,timeit方法中使用的缺省計(jì)時(shí)器總是測(cè)量掛鐘時(shí)間,這也意味著關(guān)于某函數(shù)的計(jì)時(shí)可能會(huì)受到同一計(jì)算機(jī)上運(yùn)行的其他進(jìn)程的影響。

        time.clock()計(jì)時(shí)器的平臺(tái)差異性參考以下示例(假定所在腳本名為Timing.py):

        @FuncTimer(5)

        defSqrtTiming(loops):

        importmath

        try:

        frommathimportfsum#Python2.6+

        returnfsum([math.sqrt(x)forxinrange(loops)])

        exceptImportError:#Python2.5-

        returnsum([math.sqrt(x)forxinrange(loops)])

        @FuncTimer(1)

        defSleepTiming():

        time.sleep(2)

        file=open(r'out.txt',"w+")

        foriinrange(10000):

        file.write('helloworld!')

        SqrtTiming(100000)

        SleepTiming()

        在Windows系統(tǒng)控制臺(tái)和IDLEShell里的運(yùn)行結(jié)果如下:

        E:\PyTest>Timing.py

        SqrtTiming()=>TimeElasped:150.124msec,repeated5time(s).

        SleepTiming()=>TimeElasped:2155.140msec,repeated1time(s).

        __main__.SqrtTiming()=>TimeElasped:151.809msec,repeated5time(s).

        __main__.SleepTiming()=>TimeElasped:2185.594msec,repeated1time(s).

        >>>importTiming

        Timing.SqrtTiming()=>TimeElasped:148.892msec,repeated5time(s).

        Timing.SleepTiming()=>TimeElasped:2223.157msec,repeated1time(s).

        在Linux系統(tǒng)中運(yùn)行結(jié)果與之類似。若將timerFunc改為time.clock(),則計(jì)時(shí)輸出為:

        [wangxiaoyuan_@localhost~]$timepythonTiming.py

        __main__.SqrtTiming()=>TimeElasped:320.000msec,repeated5time(s).

        __main__.SleepTiming()=>TimeElasped:330.000msec,repeated1time(s).

        real0m2.381s

        user0m0.332s

        sys0m0.019s

        可見,time.sleep(2)并未計(jì)入SleepTiming()耗時(shí),導(dǎo)致計(jì)時(shí)結(jié)果與real時(shí)間相差很大。

        對(duì)于代碼片段計(jì)時(shí),以上下文管理器為例:

        importcontextlib,sys,time

        @contextlib.contextmanager

        defBlockTimer(label='Block'):

        ifsys.platform=="win32":timerFunc=time.clock

        else:timerFunc=time.time

        startTime=timerFunc()

        try:

        yield

        finally:

        endTime=timerFunc()

        print'%s=>'%label,

        print'TimeElasped:%.3fmsec.'\

        %((endTime-startTime)*1000.0)

        基于BlockTimer測(cè)量代碼片段的示例如下:

        withBlockTimer('cPickle'):

        fromcPickleimportdumps,loads

        s=dumps([x*2.4forxinrange(100000)])

        loads(s)

        withBlockTimer('json'):

        fromjsonimportdumps,loads

        s=dumps([x*2.4forxinrange(100000)])

        loads(s)

        運(yùn)行結(jié)果如下:

        cPickle=>TimeElasped:237.569msec.

        json=>TimeElasped:181.714msec.

        可見,對(duì)于浮點(diǎn)型對(duì)象,json模塊執(zhí)行速度比cPickle模塊更快。

        當(dāng)然,借助timeit模塊也可對(duì)代碼片段計(jì)時(shí)。例如:

        fromtimeitimporttimeit

        sep='fromcPickleimportdumps,loads'

        stp='s=dumps([x*2forxinrange(100000)]);loads(s)'

        print'cPickle:%.6fsec'%timeit(stmt=stp,setup=sep,number=1)

        sej='fromjsonimportdumps,loads'

        stj='s=dumps([x*2forxinrange(100000)]);loads(s)'

        print'json:%.6fsec'%timeit(stmt=stj,setup=sej,number=1)

        本例改為整型對(duì)象,且模塊導(dǎo)入語句不計(jì)入總耗時(shí)。運(yùn)行結(jié)果如下:

        cPickle:0.100775sec

        json:0.064752sec

        可見,對(duì)于整型對(duì)象,json模塊執(zhí)行速度也比cPickle模塊快。

        以上內(nèi)容為大家介紹了Python自定義計(jì)時(shí)函數(shù),希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.2667701.com/


        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        Python 面向?qū)ο蟮能浖_發(fā)

        很多人在學(xué)完了python的class機(jī)制之后,遇到一個(gè)生產(chǎn)中的問題,還是會(huì)懵逼,這其實(shí)太正常了,因?yàn)槿魏纬绦虻拈_發(fā)都是先設(shè)計(jì)后編程,python的cla...詳情>>

        2023-11-07 23:20:48
        Python 決策樹算法思想

        決策樹(decisiontree)是一個(gè)樹結(jié)構(gòu)(可以是二叉樹或者非二叉樹)。決策樹分為分類樹和回歸樹兩種,分類樹對(duì)離散變量做決策樹,回歸樹對(duì)連續(xù)變量做...詳情>>

        2023-11-07 23:10:00
        Python C4.5算法

        ID3算法的作者昆蘭基于上面的不足,對(duì)ID3算法做了改進(jìn),這就是C4.5算法,也許你會(huì)問,為什么不叫ID4,ID5之類的名字呢?那是因?yàn)闆Q策樹當(dāng)時(shí)太火...詳情>>

        2023-11-07 23:02:48
        Python 面向過程

        python面向過程優(yōu)點(diǎn):復(fù)雜的問題流程化,進(jìn)而簡單化(一個(gè)復(fù)雜的問題,分成一個(gè)個(gè)小的步驟去實(shí)現(xiàn),實(shí)現(xiàn)小的步驟將會(huì)非常簡單)舉個(gè)典型的面向過程...詳情>>

        2023-11-07 22:55:36
        Python編程規(guī)范的重要性

        首先談一下注釋:注釋不止是為了自己以后看的更清楚,還是為了以后的開發(fā)人員所準(zhǔn)備的,其實(shí)一段時(shí)間后,當(dāng)需要對(duì)程序做一些修改或者是改正某個(gè)...詳情>>

        2023-11-07 22:37:35
        微山县| 荆州市| 冀州市| 沙湾县| 元江| 榆树市| 上犹县| 黄龙县| 宝兴县| 长顺县| 福安市| 车险| 伊宁县| 潞城市| 慈利县| 保山市| 科技| 承德市| 栾城县| 平乡县| 澳门| 中阳县| 祁连县| 北票市| 寿宁县| 静宁县| 洱源县| 高唐县| 洛浦县| 建德市| 铜梁县| 沾化县| 大渡口区| 长春市| 祁门县| 班玛县| 环江| 石棉县| 杭锦后旗| 长沙市| 绍兴县|