5種帶你輕鬆分析Python代碼的軟體庫

2021-01-10 51CTO

【51CTO.com快譯】通常,人們會使用兩種速度來衡量某種程式語言的優劣,即:開發速度和執行速度。對於Python而言,大家往往受益的是它能夠快速地編寫代碼,而忽略了它是否能夠快速地運行,並及時完成既定的任務。因此,在出現程序運行緩慢時,我們有必要從代碼層面上,找出拖慢的位置和原因,並對其進行處理。

好消息是,Python提供了許多不同用途的軟體庫,可方便我們對應用代碼進行分析,並找出導致緩慢運行的部分。它們中,有的是只帶有標準庫的單行工具,有的是可以從運行程序中收集到統計信息的複雜框架。下面,我將向您介紹其中五個可以在PyPI或Python標準庫中輕鬆獲得,且能夠跨平臺運行的軟體庫。

1.Time和Timeit

有時候,您可能只想分析兩個代碼段從前一個結束到下一個開始運行,是需要幾秒鐘還是幾分鐘。對於這樣的需求,您可能只需要一個秒表就足夠了。

Python標準庫帶有兩個可用作秒表的功能函數。其中,Time模塊具有perf_counter功能。它可以調用作業系統的高精度定時器,以按需獲得時間戳。其基本原理是:我們可以在目標操作開始前,調用一次time.perf_counter,然後在操作完成時,再調用一次,以獲得兩次的時間差。顯然,這是一種非常簡便易行的時間獲取方式。

而Timeit模塊則是會對Python代碼進行實質性的審查。它的timeit.timeit功能函數會截取一個代碼段,通過運行多次(默認為1百萬次),以獲得執行該操作所需的平均時間。我們經常可以用它來確定在某個緊密的循環中,單一操作或函數的調用時長。例如,如果您想判定一個列表解析式(list comprehension)與一個常規列表結構,哪個在執行多次操作時會更快一些(列表解析式通常更快)。

當然,Time的不足之處在於它只是一個秒表,而Timeit的不足之處在於:其主要用例是各個行或代碼塊上的各個細微標準差(microbenchmarks)。也就是說,僅當這些代碼被單獨處理時,這種比較才會有意義。因此,這兩種方法都不足以對整個程序進行分析。一旦出現數千行的代碼,這兩種方法都會耗費您大量的時間。

2.cProfile

Python標準庫還帶有一個整體程序分析器--cProfile。在程序運行時,cProfile會通過跟蹤代碼中的每個函數的調用,以生成一個包含了最常調用函數、以及平均調用時間的列表。

cProfile具有三大優勢:

由於它被包含在標準庫中,因此現有的Python安裝包已經包含了cProfile。 它可以分析有關調用行為的許多不同統計信息。例如:它能夠將函數調用自己的指令所花費的時間,與該函數所有的其他調用耗時區分開來。據此,您可以判定出到底是該函數本身運行緩慢,還是在其他調用時出現的緩慢。 可以實現限定條件的自定義。也就是說,您既可以對整個程序的運行進行採樣,又可以僅在指定的函數運行時啟用概要分析(toggle profiling)。通過縮小範圍和去除分析時產生的「噪聲」,您可以更好地關注該函數的功能與調用。

cProfile的不足之處有:

默認情況下,它會設置多個採集點,生成大量的統計信息。 根據其執行模型,它在捕獲每個函數調用時,都會產生大量的流量。因此cProfile不適合通過實時數據的方式,對生產環境中的應用程式進行性能分析。也就是說,它更適合於針對開發過程中的性能分析。

有關cProfile的更多詳細信息。

3.Pyinstrument

與cProfile的工作方式類似,Pyinstrument能夠通過跟蹤目標程序,以報告的形式,反映出那些佔用了大部分運行時間的代碼。不過,與cProfile相比,Pyinstrument的優點主要體現在如下兩個方面:

Pyinstrument不會去勾連(hook)函數調用的每個實例,而是會以毫秒為間隔,對程序的調用棧進行採樣,因此它能夠靈敏地檢測出程序中最耗費運行時的部分。 Pyinstrument的報告要簡潔得多。它能夠通過突出顯示程序中佔用時間最多的函數,以便您能儘快地發現問題,並專注分析原因。

Pyinstrument同樣具有cProfile的各種優點。您可以將它用作應用程式中的對象,來記錄所選功能,而不是整個程序的行為。Pyinstrument提供包括HTML格式在內的多種輸出形式。當然,您也可以按需查看各個調用的完整時間線。

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

某些通過C編譯的擴展程序(例如使用Cython創建的程序),會在通過命令行進行Pyinstrument調用時,可能無法正常工作。不過,如果您在程序本身使用了Pyinstrument,例如:通過使用Pyinstrument分析器的調用包裝了main()函數,那麼它們還是能夠正常工作的。 Pyinstrument不能很好地處理在多個線程中運行的代碼。此時,您可能需要考慮使用下面將要介紹到的Py-spy。

4.Py-spy

與Pyinstrument一樣,Py-spy在工作原理上,也是定期採集程序調用棧的狀態,而不是記錄每一個調用。不過,與PyInstrument不同,Py-spy帶有用Rust編寫的核心組件(而Pyinstrument使用的是C擴展程序),運行的是帶有分析程序的外進程(out-of-process),因此它可以安全地與生產環境中的代碼協同使用。

Py-spy能夠輕鬆地完成許多其他分析工具無法實現的任務,其中包括:分析多線程或帶有子處理(subprocessed)機制的Python程序等。此外,Py-spy也可以分析那些使用符號進行過編譯的C擴展程序。而對於使用了Cython編譯的擴展程序,Py-spy需要使用對應生成的C文件,以便收集正確的跟蹤信息。

我們可以使用如下兩種基本方法,來利用Py-spy檢查應用程式:

使用Py-spy的record命令,並在運行結束後會生成火焰圖(flame graph)。 使用Py-spy的top命令,通過實時更新,交互式地顯示Python應用程式的內部,並以與Unix的top工具相同的方式顯示信息。而且那些單線程棧也可以通過命令行被顯示出來。

不過,Py-spy的最大缺點之一是:它主要適用於從外部分析整個程序、或是某些組件,不適合對某個特定的功能函數進行採樣。

5.Yappi

Yappi是Yet Another Python Profiler(「另一個Python分析工具」)的縮寫。它在功能上,較上述討論過的工具庫只多不少。在默認情況下,PyCharm(譯者註:一款為專業Python 開發人員準備的IDE)會已安裝了Yappi,因此用戶在IDE中已經具有了對於Yappi的內置訪問權限。

要使用Yappi,您需要用指令來「修飾」目標代碼,以便針對分析機制進行調用,啟動,停止和生成報告。Yappi允許您根據測試的實際需求,在「經過時間(wall time)」或「CPU時間」之間進行選擇。前者只是一個秒表;後者則可以通過系統原生API,記錄下CPU在實際執行代碼過程中的用時,以便調整I/O的暫停或線程的休眠。可見,CPU時間能夠方便您更加精確地了解某些操作(例如:數字代碼的執行)的實際用時。

通過Yappi提供的函數--yappi.get_thread_stats(),您可以記錄任何一個線程活動,檢索出對應的統計信息,並分別對其進行分析。您不但無需「修飾」線程代碼,而且可以對統計數據進行過濾和細粒度的排序(類似於cProfile中的此類操作)。

此外,Yappi的獨到之處在於,它可以分析greenlet和coroutine(協程)。作為一種分析並發代碼的強大工具,它可以被廣泛地用來分析異步metaphor。

原文標題:5 great libraries for profiling Python code,作者:Serdar Yegulalp

【51CTO譯稿,合作站點轉載請註明原文譯者和出處為51CTO.com】

【編輯推薦】

【責任編輯:

華軒

TEL:(010)68476606】

點讚 0

相關焦點

  • 5種方法,加密你的Python代碼
    其中一個缺點,讓不少開發者頭疼不已,由於Python解釋器開源的關係,導致Python代碼無法加密,代碼的安全性得不到保障。當然,想要加密Python代碼,也並非無解。最常見的加密方式有4種,還有1種獨特的加密方式。
  • vscode寫Python數據處理分析代碼,由安裝配置到cell交互模式
    先看看界面:重點是左邊紅框處5個小圖標,他們表示各個基礎功能,不過現在我們不需要深入了解他們此時的vscode只是一個漂亮的記事本而已,我們需要讓vscode安裝一些輔助插件:點擊左邊最後一個小圖標,這是安裝插件的地方在輸入框輸入"python"第一個出來的結果,點擊安裝,相信在幾秒內就安裝完成這插件是出自微軟,信心有保證此時你可能會注意到,vscode
  • 讓Python代碼更快運行的 5 種方法
    Python很簡單易用,但大多數人使用Python都知道在處理密集型cpu工作時,它的數量級依然低於C、Java和JavaScript。但不少第三方不願贅述Python的優點,而是決定自內而外提高其性能。
  • 在Rust 代碼中編寫 Python 是種怎樣的體驗?
    { .. }宏輕鬆地將一些Python混合到Rust代碼中。在本系列中,我將從頭展示開發此類庫的過程。預覽如果不熟悉inline-python類庫,你可以執行以下操作:fn main() {let who = "world";let n = 5; python!
  • 5種非常棒的 Python 技巧,使你的代碼更優雅
    今天教大家一些 Python 技巧,它可以使你的代碼更優雅和高效。列表只需一行代碼,讓你的代碼看起來更簡潔,並且看起來更專業。a = [2,5,7,9]b = []for i in range(len(a)):    b.append(a[i]+1)這是正常的 code 方式,現在讓它更加簡潔、專業一點。
  • 使用一行Python代碼從圖像讀取文本
    雖然圖像分類和涉及到一定程度計算機視覺的任務可能需要大量的代碼和紮實的理解,但是從格式良好的圖像中讀取文本在Python中卻是簡單的,並且可以應用於許多現實生活中的問題。在今天的帖子中,我想證明這一點。雖然會安裝一些庫,但不會花很多時間。
  • 八行python代碼展現程式設計師從入門到大神的八種階段
    你敢想像你從入門python代碼、網絡達人、反重力怪才、愛情自由怪、資源盜獵者、頓悟入禪、無所不能或者卷鋪跑路8個狀態只用了簡簡單單的8行代碼嗎?這八種狀態也是一個程式設計師從入門到大神(跑路)的八個階段,每個階段對應一行代碼並且可以直接運行,看看你現在已經到了哪個階段1.初學pythonprint("Hello World!")
  • Python代碼技巧,你值得擁有!
    第一種方式是按字典的value升序排序,第二種方式是按字典的key升序排序,第三種方式是按字典的value降序排序,和第一種方式相反,因為指定了參數reverse為True。這裡排序的方法和字典排序類似,第一種是按user的key升序排序,第二種是按user的name升序排序。其實還支持名字相同,再按key進行排序,如下:
  • 用一行python代碼輕鬆解決,沒想到它這麼強
    python無所不能,是python之父GuidovanRossum的一個朋友說的。而python有多無所不能呢?下面羽憶教程為你展示一行python代碼可以做到輸出九九乘法表,甚至更多喪心病狂的事情,用python一行代碼統統搞定。
  • 獨家 | 帶你入門比Python更高效的Numpy(附代碼)
    但與R或Julia不同的是,它是通用型程式語言,沒有功能語法來立即開始分析和轉換數值數據。所以,它需要專門的庫。Numpy是Numerical Python的縮寫,是Python生態系統中高性能科學計算和數據分析所需的基礎軟體包。
  • 掌握這10個python技巧,讓你代碼工作如魚得水!
    圖源:Unsplash10個Python小技巧1.= 45 Quotient = 5.05.若數字是3的倍數,輸出「fizz」;是5的倍數,輸出「buzz」;既是3又是5的倍數,輸出「fizzbuzz」。
  • 六個步驟,封裝你最愛的Python代碼包!
    以下是它的幾點優勢: · 即使只有很少人使用,共享自己的代碼仍是一件很有趣的事;程式設計師可以在工作、社群活動或求職面試中分享並展示自己的勞動成果。· 通過強制性地整理和記錄代碼,公開給同行進行評價,從而改進代碼。· 它還能彌補社群的不足。你會驚訝地發現,很多人會注意到你的序列化十分高效,比如將HTTP報頭序列化到JSON。
  • 5款最受Python開發者歡迎的Python IDE和代碼編輯器
    5個Python IDE和文本編輯器的比較在本文中,我們將介紹5個熱門的Python IDE和5個Python文本編輯器。根據您的領域,價格和功能-您將看到最適合您的Python IDE和代碼編輯器。分不清是使用Eclipse這樣的IDE,還是應該使用Sublime文本這樣簡單的東西?
  • 你需要知道的Python代碼規範性檢查(pylint和flake8)
    關於Python代碼規範,之前寫過一篇相關的文章你熟悉Python的代碼規範嗎
  • 數據分析從業者必看,10 個加速 python 數據分析的簡單的小技巧
    它用一行代碼顯示了大量信息,在交互式 HTML 報告中也顯示了這些信息。對於給定的數據集,pandas 分析包計算以下統計信息:中顯示數據分析報告所需的全部代碼。讓我們看看其中一些在常見數據分析任務中可能有用的功能:% pastebin %Pastebin 將代碼上載到 Pastebin 並返回 URL。Pastebin 是一種在線內容託管服務,我們可以在其中存儲純文本(如原始碼片段),然後可以與其他人共享 URL。
  • @Python 開發者,如何更加高效地編寫代碼?
    對於 Python 開發者而言,Anaconda 能省下大量時間下載和安裝模塊包、處理項目環境等問題,幫助開發者更加愉快地編寫代碼。如果你苦於給 Python 安裝各種包,安裝過程中還各種出錯。那麼我牆裂推薦——Anaconda,它可以幫助你管理這些包,包括安裝、卸載、更新。
  • 讓你的 Python 代碼優雅又地道
    —— Edsger Wybe Dijkstra在Python社區文化的澆灌下,演化出了一種獨特的代碼風格,去指導如何正確地使用Python,這就是常說的pythonic。一般說地道(idiomatic)的python代碼,就是指這份代碼很pythonic。Python的語法和標準庫設計,處處契合著pythonic的思想。
  • 你需要立刻學會的20個Python代碼段
    在必要時刻,這些小訣竅能夠減少你上網查Stack Overflow的麻煩。而且它們會在每日編程練習中助你一臂之力。1. 反轉字符串以下代碼使用Python切片操作來反轉字符串。輸出 n次字符串或列表 你可以對字符串或列表使用乘法(*)。如此一來,可以按照需求將它們任意倍增。
  • 這25條極簡Python代碼,你還不知道
    ,就被它的簡單性、出色的可讀性和特別流行的一行代碼所吸引。a,b,c = 4,5.5,'Hello'#print(a,b,c) >> 4,5.5,hello你可以使用逗號和變量一次性將多個值分配給變量。使用此技術,你可以一次分配多個數據類型。 你可以使用列表將值分配給變量。下面是將列表中的多個值分配給變量的示例。
  • 六大主流語言代碼漏洞分析報告出爐
    靜態代碼分析安全公司 Veracode 近日發布了一份應用程式分析報告,結果發現比起 JavaScript 和 Python 等語言,C++ 和 PHP 的安全漏洞要嚴重得多。