摘要:借助,自動提取代碼的動態(tài)調(diào)用流程圖。繪制類圖安裝是一個開源圖形可視化軟件。循環(huán)曲線表示遞歸過程調(diào)用。繪制的常用工具有靜態(tài)調(diào)用圖等。包括模塊之間的調(diào)用流程函數(shù)調(diào)用次數(shù)及耗時等。
在設(shè)計軟件、分析代碼時,我們常常會借助UML以及函數(shù)調(diào)用圖,來幫自己梳理思路。
尤其是遇到bug時,借助這些可視化手段,也可以幫你在調(diào)試過程中發(fā)現(xiàn)邏輯錯誤。
本文主要介紹以下兩個方法:
借助graphviz+pyreverse,自動提取python代碼的UML類圖和包依賴關(guān)系。
借助graphviz+pycallgraph,自動提取python代碼的動態(tài)調(diào)用流程圖。
Graphviz 是一個開源圖形可視化軟件。
Graphviz 以簡單的文本語言對圖形進(jìn)行描述,并以多種有用的格式制作圖表,例如用于網(wǎng)頁的圖像和 SVG,用于包含在 PDF 或其他文檔中的 Postscript;或顯示在交互式圖形瀏覽器中。
步驟①:從官網(wǎng)下載graphviz軟件
官網(wǎng)下載:http://www.graphviz.org/download/
下載exe安裝包,完成graphviz軟件安裝,并找到bin路徑。
步驟②:設(shè)置環(huán)境變量
步驟③:安裝對應(yīng)python庫
$ conda install python-graphviz
pyreverse是一組用于對 Python 代碼進(jìn)行逆向工程的實(shí)用程序。
可以分析Python代碼并提取 UML 類圖和包依賴關(guān)系1:
Pyreverse 現(xiàn)在已集成到 pylint 中:http://pypi.python.org/pypi/pylint/
安裝pylint:
$ pip install pylint
注意:pip install pyreverse時,會發(fā)現(xiàn)已經(jīng)找不到這個庫了:ERROR: Could not find a version that satisfies the requirement pyreverse
,不過pylint中已經(jīng)包含了pyreverse,所以直接安裝pylint即可。
UML類圖常用于面向?qū)ο蟮慕V校琔ML類圖的每個方框是一個對象類,每個框從上到下分為三部分,第一部分是對象類名稱,第二部分是類的屬性,第三部分是類的函數(shù)。
在命令行輸入語句,生成package的UML圖:
$ pyreverse -o png -p Pyreverse pylint/pyreverse/[...]creating diagram packages_Pyreverse.pngcreating diagram classes_Pyreverse.png
函數(shù)調(diào)用圖(Call Graph)是一個控制流程圖,用于表示程序中各個單元之間的調(diào)用關(guān)系。每個節(jié)點(diǎn)之間的邊緣表示調(diào)用過程。循環(huán)曲線表示遞歸過程調(diào)用。2
繪制Call Graph的常用工具有:pycallgraph、pyan(靜態(tài)調(diào)用圖)、gprof2dot 、code2flow等。本文主要介紹pycallgraph的用法。
pycallgraph是一個python模塊,可以對python代碼進(jìn)行動態(tài)調(diào)用圖分析3。包括模塊之間的調(diào)用流程、函數(shù)調(diào)用次數(shù)及耗時等。
同2.1節(jié)。
步驟①:從官網(wǎng)下載graphviz軟件
官網(wǎng)下載:http://www.graphviz.org/download/
下載exe安裝包,完成graphviz軟件安裝,并找到bin路徑。
步驟②:設(shè)置環(huán)境變量
步驟③:安裝對應(yīng)python庫
$ pip install graphviz
安裝pycallgraph:
$ pip install pycallgraph
$ pycallgraph graphviz -- ./mypythonscript.py
最簡單的例子,直接在要分析的函數(shù)調(diào)用前,加上with PyCallGraph(output=GraphvizOutput()):
:
from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput()): # 調(diào)用你要分析的函數(shù) code_to_profile()
如果需要指定調(diào)用圖中包含(include)哪些函數(shù)、排除(exclude)哪些函數(shù),就要用到GlobbingFilter(include=[....])
、GlobbingFilter(exclude=[....])
,例如這樣4:
from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputfrom pycallgraph import Configfrom pycallgraph import GlobbingFilterdef main(): # TODO: 調(diào)用各種類、函數(shù) return if __name__ == "__main__": config = Config() # 調(diào)用圖中包括(include)哪些函數(shù) # 用moduleName.*表示,包含某個模塊內(nèi)的所有函數(shù) config.trace_filter = GlobbingFilter(include=[ "main", "app.*", "widgets.list_widget.*", "utils.RegionInfo.*" ]) # 調(diào)用圖中不包括(exclude)哪些函數(shù) # config.trace_filter = GlobbingFilter(exclude=[ # "moduleA.*", # "moduleB.*", # "*.funcB" # ]) graphviz = GraphvizOutput() graphviz.output_file = "graph.png" with PyCallGraph(output=graphviz, config=config): main()
在程序正常運(yùn)行完之后,就會在當(dāng)前路徑生成graph.png文件。
越是復(fù)雜的程序,生成的調(diào)用圖就會越大,注意選取你最關(guān)注的函數(shù)進(jìn)行可視化。
其他高級用法可以參考:
官方文檔:https://pycallgraph.readthedocs.io/en/master/
本文介紹了兩個python代碼可視化工具:
借助graphviz+pyreverse,可以自動提取python代碼的UML類圖。
借助graphviz+pycallgraph,可以自動提取python代碼的動態(tài)調(diào)用圖。
如果對你有幫助的話,歡迎一鍵三連支持下博主。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/122568.html
摘要:聯(lián)合查找算法是并查集數(shù)據(jù)結(jié)構(gòu)一種應(yīng)用。并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),其保持著用于處理一些不相交集合的合并及查詢問題。的特征是刪除節(jié)點(diǎn)。目前就職于騰訊事業(yè)部,從事神經(jīng)機(jī)器翻譯工作。 5. TF - Graph模塊TF把神經(jīng)網(wǎng)絡(luò)模型表達(dá)成一張拓?fù)浣Y(jié)構(gòu)的Graph,Graph中的一個節(jié)點(diǎn)表示一種計算算子。Graph從輸入到輸出的Tensor數(shù)據(jù)流動完成了一個運(yùn)算過程,這是對類似概率圖、神經(jīng)網(wǎng)絡(luò)等連接...
摘要:本文依據(jù)對簡稱白皮書和官方教程的理解,從系統(tǒng)和代碼實(shí)現(xiàn)角度講解的內(nèi)部實(shí)現(xiàn)原理。這一點(diǎn)是和包括在內(nèi)的符號編程框架較大的不同。的做法是引入了來處理。這樣就幾乎讓本身成為一門獨(dú)立的語言。當(dāng)為是,執(zhí)行操作當(dāng)為時,執(zhí)行操作。支持的控制算子有和等。 摘要2015年11月9日,Google發(fā)布深度學(xué)習(xí)框架TensorFlow并宣布開源,并迅速得到廣泛關(guān)注,在圖形分類、音頻處理、推薦系統(tǒng)和自然語言處理等場景...
摘要:相對于靜態(tài)圖表,人類總是容易被動畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數(shù)據(jù)對行對象進(jìn)行填充。現(xiàn)在用將它們轉(zhuǎn)換為動畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:相對于靜態(tài)圖表,人類總是容易被動畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數(shù)據(jù)對行對象進(jìn)行填充。現(xiàn)在用將它們轉(zhuǎn)換為動畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:前言之前受知乎用戶啟發(fā),寫了個源碼的調(diào)用圖生成器,可以以圖示法顯示函數(shù)的調(diào)用關(guān)系,代碼放在了倉庫里,僅供參考主要思路利用的的注入選項(xiàng),得到每個函數(shù)的調(diào)用地址信息,生成一個文件,然后利用和將函數(shù)名及其所在源碼位置從地址中解析出來,從而得到 前言 之前受知乎用戶mailto1587啟發(fā),寫了個C++源碼的調(diào)用圖生成器,可以以圖示法顯示C++函數(shù)的調(diào)用關(guān)系,代碼放在了github倉庫里,僅供...
閱讀 3623·2021-11-24 09:39
閱讀 2557·2021-11-15 11:37
閱讀 2216·2021-11-11 16:55
閱讀 5206·2021-10-14 09:43
閱讀 3711·2021-10-08 10:05
閱讀 3012·2021-09-13 10:26
閱讀 2333·2021-09-08 09:35
閱讀 3541·2019-08-30 15:55