上下文管理器和timeit.timeit()方法也適合單條語句計時。除此之外,也可通過命令行執(zhí)行timeit計時,命令選項詳見官方幫助。
通過命令行執(zhí)行timeit計時,可方便地測量和對比相同功能不同實現(xiàn)表達(dá)式的性能:
E:\PyTest>python-mtimeit-r5"'-'.join(str(n)forninrange(100))"
10000loops,bestof5:32.8usecperloop
E:\PyTest>python-mtimeit-r5"'-'.join([str(n)forninrange(100)])"
10000loops,bestof5:29.8usecperloop
E:\PyTest>python-mtimeit-r5"'-'.join(map(str,range(100)))"
10000loops,bestof5:21.8usecperloop
以上三條待計時的Python表達(dá)式均被重復(fù)測試5次,每次測試中調(diào)用該表達(dá)式10000次。相同機(jī)器上運(yùn)行的其他程序可能會影響計時測量,因此重復(fù)測量若干次再選取最佳結(jié)果(besttime),以保證計時的準(zhǔn)確性。考慮到后臺進(jìn)程等因素通常會增加總耗時,因此最佳結(jié)果取重復(fù)測量的最小值(添加-v選項可查看各次測量值),而非平均值。由本例輸出結(jié)果可知,map快于列表解析,而列表解析快于生成器(生成器表達(dá)式用作參數(shù)時可省略外部的括號)。注意,這三者的快慢對比會因場景而異。例如,[xforxinrange(10000)]比map(lambdax:x,range(10000))快三倍。因此,應(yīng)根據(jù)Profiler工具的實測值而非"經(jīng)驗"來分析性能。
此外,需注意雙引號和單引號的內(nèi)外位置。在作者的Windows主機(jī)上外單內(nèi)雙會觸發(fā)"EOLwhilescanningstringliteral"的語法錯誤,而在Linux主機(jī)上外單內(nèi)雙和外雙內(nèi)單均可正確解析。
再舉一例:
E:\PyTest>python-mtimeit-r5-s"importmath""math.sqrt(255)"
10000000loops,bestof5:0.188usecperloop
E:\PyTest>
E:\PyTest>python-mtimeit-r5-s"frommathimportsqrt""sqrt(255)"
10000000loops,bestof5:0.143usecperloop
類似地,此處Windows主機(jī)只接受雙引號,而Linux主機(jī)單雙"通吃"。由輸出結(jié)果可知,使用from語句導(dǎo)入比常規(guī)導(dǎo)入更快。同時也可看到,通過導(dǎo)入目標(biāo)模塊,timeit命令行也可對其函數(shù)甚至整個模塊(存在入口函數(shù)時)計時。
最后是兩點忠告:
進(jìn)行性能評估時,要牢記任何測量結(jié)果只是一個估算值。即使相當(dāng)可靠的計時工具,多次測量的結(jié)果也很可能有所出入。謹(jǐn)慎選取最佳結(jié)果,才能盡可能保證評估的準(zhǔn)確性。
盡量使用標(biāo)準(zhǔn)庫提供的計時工具,而不要自己編寫計時函數(shù)。因為普通開發(fā)者難以全面考慮處理器時間片、后臺持續(xù)或間歇運(yùn)行的程序(如定時更新或殺毒)、網(wǎng)絡(luò)連接、結(jié)果緩存、編譯優(yōu)化等多方面因素,導(dǎo)致自定義計時工具精度不高,某些情況下甚至完全偏離真實數(shù)據(jù)。
以上內(nèi)容為大家介紹了Python單條語句計時,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。