成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

5種帶你輕松分析Python代碼的軟件庫(kù)

譯文
開(kāi)發(fā) 后端
Python提供了許多不同用途的軟件庫(kù),可方便我們對(duì)應(yīng)用代碼進(jìn)行分析,并找出導(dǎo)致緩慢運(yùn)行的部分。本文將向您介紹五個(gè)可以在PyPI或Python標(biāo)準(zhǔn)庫(kù)中輕松獲得,且能夠跨平臺(tái)運(yùn)行的軟件庫(kù)。

【51CTO.com快譯】通常,人們會(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)行處理。

[[360188]]

好消息是,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)行采樣,又可以?xún)H在指定的函數(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í)間線(xiàn)。

此外,如下兩個(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è)線(xiàn)程中運(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ù),其中包括:分析多線(xiàn)程或帶有子處理(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工具相同的方式顯示信息。而且那些單線(xiàn)程棧也可以通過(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,因此用戶(hù)在IDE中已經(jīng)具有了對(duì)于Yappi的內(nèi)置訪(fǎng)問(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的暫停或線(xiàn)程的休眠。可見(jiàn),CPU時(shí)間能夠方便您更加精確地了解某些操作(例如:數(shù)字代碼的執(zhí)行)的實(shí)際用時(shí)。

通過(guò)Yappi提供的函數(shù)--yappi.get_thread_stats(),您可以記錄任何一個(gè)線(xiàn)程活動(dòng),檢索出對(duì)應(yīng)的統(tǒng)計(jì)信息,并分別對(duì)其進(jìn)行分析。您不但無(wú)需“修飾”線(xiàn)程代碼,而且可以對(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 great libraries for profiling Python code,作者:Serdar Yegulalp

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2018-03-24 21:38:54

Python數(shù)據(jù)庫(kù)數(shù)據(jù)可視化

2018-03-26 14:20:23

PythonMatplotlib數(shù)據(jù)可視化

2023-12-04 09:36:00

Python數(shù)據(jù)庫(kù)

2018-10-13 09:02:25

Python 開(kāi)發(fā)深度學(xué)習(xí)

2011-04-01 13:56:12

SQL Server數(shù)

2016-10-08 22:33:54

相關(guān)分析數(shù)據(jù)

2020-10-25 08:56:31

數(shù)據(jù)分析數(shù)據(jù)大數(shù)據(jù)

2023-08-18 14:39:02

2019-10-26 13:59:35

PythonRFM模型數(shù)據(jù)

2020-08-12 16:57:50

數(shù)據(jù)庫(kù)亞馬遜云科技

2021-01-01 14:36:03

Python開(kāi)發(fā)語(yǔ)言

2020-05-28 13:11:37

Python編碼 開(kāi)發(fā)

2024-01-03 08:12:10

計(jì)算求和Python內(nèi)置函數(shù)

2020-04-27 09:25:16

Python爬蟲(chóng)庫(kù)數(shù)據(jù)科學(xué)

2021-05-12 11:30:23

Python自然語(yǔ)言技術(shù)

2019-01-16 18:39:24

數(shù)據(jù)開(kāi)發(fā)模型

2024-01-18 09:39:00

Python折線(xiàn)圖時(shí)間序列分析

2021-06-24 17:55:40

Python 開(kāi)發(fā)編程語(yǔ)言

2021-11-29 07:47:56

RocketMQ分布式消息

2011-02-23 14:46:21

FileZilla
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩精品一区 | 欧美久久久久久 | 三级视频国产 | 日韩中文在线视频 | 九九伊人sl水蜜桃色推荐 | 中文字幕欧美在线观看 | 欧美国产激情 | 国产精品a久久久久 | av毛片在线播放 | 欧美在线视频免费 | 一本色道精品久久一区二区三区 | av天天爽| 日本不卡一区二区三区 | 亚洲精品久久久久久一区二区 | 久久国产婷婷国产香蕉 | 国产在线观 | 性欧美xxxx | 精品欧美一区免费观看α√ | 欧美性tv | 免费a级毛片在线播放 | 国产91av视频| 看片地址 | 亚洲高清网 | 精品久久99| 日韩高清一区 | 日韩av一二三区 | 日本精品一区二区三区在线观看视频 | 992tv人人草 久久精品超碰 | 91视视频在线观看入口直接观看 | 黄在线 | 免费在线观看黄色av | 久久久成人精品 | 91精品麻豆日日躁夜夜躁 | 亚洲一级毛片 | 久久精点视频 | 亚洲欧美国产精品久久 | 久久网亚洲 | 久久91| 欧美日韩电影一区 | 国产精品99久久久久久久久久久久 | 国产69精品久久99不卡免费版 |