日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
5種帶你輕松分析Python代碼的軟件庫(kù)

通常,人們會(huì)使用兩種速度來(lái)衡量某種編程語(yǔ)言的優(yōu)劣,即:開(kāi)發(fā)速度和執(zhí)行速度。對(duì)于Python而言,大家往往受益的是它能夠快速地編寫(xiě)代碼,而忽略了它是否能夠快速地運(yùn)行,并及時(shí)完成既定的任務(wù)。因此,在出現(xiàn)程序運(yùn)行緩慢時(shí),我們有必要從代碼層面上,找出拖慢的位置和原因,并對(duì)其進(jìn)行處理。

作為一家“創(chuàng)意+整合+營(yíng)銷(xiāo)”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷(xiāo)運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷(xiāo)方法,創(chuàng)造更大的價(jià)值。

好消息是,Python提供了許多不同用途的軟件庫(kù),可方便我們對(duì)應(yīng)用代碼進(jìn)行分析,并找出導(dǎo)致緩慢運(yùn)行的部分。它們中,有的是只帶有標(biāo)準(zhǔn)庫(kù)的單行工具,有的是可以從運(yùn)行程序中收集到統(tǒng)計(jì)信息的復(fù)雜框架。下面,我將向您介紹其中五個(gè)可以在PyPI或Python標(biāo)準(zhǔn)庫(kù)中輕松獲得,且能夠跨平臺(tái)運(yùn)行的軟件庫(kù)。

1.Time和Timeit

有時(shí)候,您可能只想分析兩個(gè)代碼段從前一個(gè)結(jié)束到下一個(gè)開(kāi)始運(yùn)行,是需要幾秒鐘還是幾分鐘。對(duì)于這樣的需求,您可能只需要一個(gè)秒表就足夠了。

Python標(biāo)準(zhǔn)庫(kù)帶有兩個(gè)可用作秒表的功能函數(shù)。其中,Time模塊具有perf_counter功能。它可以調(diào)用操作系統(tǒng)的高精度定時(shí)器,以按需獲得時(shí)間戳。其基本原理是:我們可以在目標(biāo)操作開(kāi)始前,調(diào)用一次time.perf_counter,然后在操作完成時(shí),再調(diào)用一次,以獲得兩次的時(shí)間差。顯然,這是一種非常簡(jiǎn)便易行的時(shí)間獲取方式。

而Timeit模塊則是會(huì)對(duì)Python代碼進(jìn)行實(shí)質(zhì)性的審查。它的timeit.timeit功能函數(shù)會(huì)截取一個(gè)代碼段,通過(guò)運(yùn)行多次(默認(rèn)為1百萬(wàn)次),以獲得執(zhí)行該操作所需的平均時(shí)間。我們經(jīng)??梢杂盟鼇?lái)確定在某個(gè)緊密的循環(huán)中,單一操作或函數(shù)的調(diào)用時(shí)長(zhǎng)。例如,如果您想判定一個(gè)列表解析式(list comprehension)與一個(gè)常規(guī)列表結(jié)構(gòu),哪個(gè)在執(zhí)行多次操作時(shí)會(huì)更快一些(列表解析式通常更快)。

當(dāng)然,Time的不足之處在于它只是一個(gè)秒表,而Timeit的不足之處在于:其主要用例是各個(gè)行或代碼塊上的各個(gè)細(xì)微標(biāo)準(zhǔn)差(microbenchmarks)。也就是說(shuō),僅當(dāng)這些代碼被單獨(dú)處理時(shí),這種比較才會(huì)有意義。因此,這兩種方法都不足以對(duì)整個(gè)程序進(jìn)行分析。一旦出現(xiàn)數(shù)千行的代碼,這兩種方法都會(huì)耗費(fèi)您大量的時(shí)間。

2.cProfile

Python標(biāo)準(zhǔn)庫(kù)還帶有一個(gè)整體程序分析器--cProfile。在程序運(yùn)行時(shí),cProfile會(huì)通過(guò)跟蹤代碼中的每個(gè)函數(shù)的調(diào)用,以生成一個(gè)包含了最常調(diào)用函數(shù)、以及平均調(diào)用時(shí)間的列表。

cProfile具有三大優(yōu)勢(shì):

  • 由于它被包含在標(biāo)準(zhǔn)庫(kù)中,因此現(xiàn)有的Python安裝包已經(jīng)包含了cProfile。
  • 它可以分析有關(guān)調(diào)用行為的許多不同統(tǒng)計(jì)信息。例如:它能夠?qū)⒑瘮?shù)調(diào)用自己的指令所花費(fèi)的時(shí)間,與該函數(shù)所有的其他調(diào)用耗時(shí)區(qū)分開(kāi)來(lái)。據(jù)此,您可以判定出到底是該函數(shù)本身運(yùn)行緩慢,還是在其他調(diào)用時(shí)出現(xiàn)的緩慢。
  • 可以實(shí)現(xiàn)限定條件的自定義。也就是說(shuō),您既可以對(duì)整個(gè)程序的運(yùn)行進(jìn)行采樣,又可以僅在指定的函數(shù)運(yùn)行時(shí)啟用概要分析(toggle profiling)。通過(guò)縮小范圍和去除分析時(shí)產(chǎn)生的“噪聲”,您可以更好地關(guān)注該函數(shù)的功能與調(diào)用。

cProfile的不足之處有:

  • 默認(rèn)情況下,它會(huì)設(shè)置多個(gè)采集點(diǎn),生成大量的統(tǒng)計(jì)信息。
  • 根據(jù)其執(zhí)行模型,它在捕獲每個(gè)函數(shù)調(diào)用時(shí),都會(huì)產(chǎn)生大量的流量。因此cProfile不適合通過(guò)實(shí)時(shí)數(shù)據(jù)的方式,對(duì)生產(chǎn)環(huán)境中的應(yīng)用程序進(jìn)行性能分析。也就是說(shuō),它更適合于針對(duì)開(kāi)發(fā)過(guò)程中的性能分析。

有關(guān)cProfile的更多詳細(xì)信息。

3.Pyinstrument

與cProfile的工作方式類(lèi)似,Pyinstrument能夠通過(guò)跟蹤目標(biāo)程序,以報(bào)告的形式,反映出那些占用了大部分運(yùn)行時(shí)間的代碼。不過(guò),與cProfile相比,Pyinstrument的優(yōu)點(diǎn)主要體現(xiàn)在如下兩個(gè)方面:

  • Pyinstrument不會(huì)去勾連(hook)函數(shù)調(diào)用的每個(gè)實(shí)例,而是會(huì)以毫秒為間隔,對(duì)程序的調(diào)用棧進(jìn)行采樣,因此它能夠靈敏地檢測(cè)出程序中最耗費(fèi)運(yùn)行時(shí)的部分。
  • Pyinstrument的報(bào)告要簡(jiǎn)潔得多。它能夠通過(guò)突出顯示程序中占用時(shí)間最多的函數(shù),以便您能盡快地發(fā)現(xiàn)問(wèn)題,并專(zhuān)注分析原因。

Pyinstrument同樣具有cProfile的各種優(yōu)點(diǎn)。您可以將它用作應(yīng)用程序中的對(duì)象,來(lái)記錄所選功能,而不是整個(gè)程序的行為。Pyinstrument提供包括HTML格式在內(nèi)的多種輸出形式。當(dāng)然,您也可以按需查看各個(gè)調(diào)用的完整時(shí)間線。

此外,如下兩個(gè)方面值得您的注意:

  • 某些通過(guò)C編譯的擴(kuò)展程序(例如使用Cython創(chuàng)建的程序),會(huì)在通過(guò)命令行進(jìn)行Pyinstrument調(diào)用時(shí),可能無(wú)法正常工作。不過(guò),如果您在程序本身使用了Pyinstrument,例如:通過(guò)使用Pyinstrument分析器的調(diào)用包裝了main()函數(shù),那么它們還是能夠正常工作的。
  • Pyinstrument不能很好地處理在多個(gè)線程中運(yùn)行的代碼。此時(shí),您可能需要考慮使用下面將要介紹到的Py-spy。

4.Py-spy

與Pyinstrument一樣,Py-spy在工作原理上,也是定期采集程序調(diào)用棧的狀態(tài),而不是記錄每一個(gè)調(diào)用。不過(guò),與PyInstrument不同,Py-spy帶有用Rust編寫(xiě)的核心組件(而Pyinstrument使用的是C擴(kuò)展程序),運(yùn)行的是帶有分析程序的外進(jìn)程(out-of-process),因此它可以安全地與生產(chǎn)環(huán)境中的代碼協(xié)同使用。

Py-spy能夠輕松地完成許多其他分析工具無(wú)法實(shí)現(xiàn)的任務(wù),其中包括:分析多線程或帶有子處理(subprocessed)機(jī)制的Python程序等。此外,Py-spy也可以分析那些使用符號(hào)進(jìn)行過(guò)編譯的C擴(kuò)展程序。而對(duì)于使用了Cython編譯的擴(kuò)展程序,Py-spy需要使用對(duì)應(yīng)生成的C文件,以便收集正確的跟蹤信息。

我們可以使用如下兩種基本方法,來(lái)利用Py-spy檢查應(yīng)用程序:

  • 使用Py-spy的record命令,并在運(yùn)行結(jié)束后會(huì)生成火焰圖(flame graph)。
  • 使用Py-spy的top命令,通過(guò)實(shí)時(shí)更新,交互式地顯示Python應(yīng)用程序的內(nèi)部,并以與Unix的top工具相同的方式顯示信息。而且那些單線程棧也可以通過(guò)命令行被顯示出來(lái)。

不過(guò),Py-spy的最大缺點(diǎn)之一是:它主要適用于從外部分析整個(gè)程序、或是某些組件,不適合對(duì)某個(gè)特定的功能函數(shù)進(jìn)行采樣。

5.Yappi

Yappi是Yet Another Python Profiler(“另一個(gè)Python分析工具”)的縮寫(xiě)。它在功能上,較上述討論過(guò)的工具庫(kù)只多不少。在默認(rèn)情況下,PyCharm(譯者注:一款為專(zhuān)業(yè)Python 開(kāi)發(fā)人員準(zhǔn)備的IDE)會(huì)已安裝了Yappi,因此用戶在IDE中已經(jīng)具有了對(duì)于Yappi的內(nèi)置訪問(wèn)權(quán)限。

要使用Yappi,您需要用指令來(lái)“修飾”目標(biāo)代碼,以便針對(duì)分析機(jī)制進(jìn)行調(diào)用,啟動(dòng),停止和生成報(bào)告。Yappi允許您根據(jù)測(cè)試的實(shí)際需求,在“經(jīng)過(guò)時(shí)間(wall time)”或“CPU時(shí)間”之間進(jìn)行選擇。前者只是一個(gè)秒表;后者則可以通過(guò)系統(tǒng)原生API,記錄下CPU在實(shí)際執(zhí)行代碼過(guò)程中的用時(shí),以便調(diào)整I/O的暫停或線程的休眠??梢?jiàn),CPU時(shí)間能夠方便您更加精確地了解某些操作(例如:數(shù)字代碼的執(zhí)行)的實(shí)際用時(shí)。

通過(guò)Yappi提供的函數(shù)--yappi.get_thread_stats(),您可以記錄任何一個(gè)線程活動(dòng),檢索出對(duì)應(yīng)的統(tǒng)計(jì)信息,并分別對(duì)其進(jìn)行分析。您不但無(wú)需“修飾”線程代碼,而且可以對(duì)統(tǒng)計(jì)數(shù)據(jù)進(jìn)行過(guò)濾和細(xì)粒度的排序(類(lèi)似于cProfile中的此類(lèi)操作)。

此外,Yappi的獨(dú)到之處在于,它可以分析greenlet和coroutine(協(xié)程)。作為一種分析并發(fā)代碼的強(qiáng)大工具,它可以被廣泛地用來(lái)分析異步metaphor。


新聞標(biāo)題:5種帶你輕松分析Python代碼的軟件庫(kù)
文章位置:http://www.dlmjj.cn/article/dpoddho.html