使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析
技術(shù)背景
在上一篇博客中,我們介紹了使用量子計(jì)算模擬器ProjectQ去生成一個(gè)隨機(jī)數(shù),也介紹了隨機(jī)數(shù)的應(yīng)用場(chǎng)景等。但是有些時(shí)候我們希望可以打開(kāi)這里面實(shí)現(xiàn)的原理,去看看在產(chǎn)生隨機(jī)數(shù)的過(guò)程中經(jīng)歷了哪些運(yùn)算,調(diào)用了哪些模塊。只有梳理清楚這些相關(guān)的內(nèi)容,我們才能夠更好的使用這個(gè)產(chǎn)生隨機(jī)數(shù)的功能。這里我們就引入一個(gè)工具pycallgraph
,可以根據(jù)執(zhí)行的代碼,給出這些代碼背后所封裝和調(diào)用的所有函數(shù)、類(lèi)的關(guān)系圖,讓我們一起來(lái)了解下這個(gè)工具的安裝和使用方法。
Manjaro Linux平臺(tái)安裝graphviz
首先用pip安裝graphviz:
[dechin@dechin-manjaro callgraph]$ python3 -m pip install graphviz Collecting graphviz Downloading graphviz-0.16-py2.py3-none-any.whl (19 kB) Installing collected packages: graphviz Successfully installed graphviz-0.16
然后再安裝pycallgraph,這兩者有先后的依賴(lài)關(guān)系:
[dechin@dechin-manjaro callgraph]$ python3 -m pip install pycallgraph Collecting pycallgraph Downloading pycallgraph-1.0.1.tar.gz (36 kB) Building wheels for collected packages: pycallgraph Building wheel for pycallgraph (setup.py) ... done Created wheel for pycallgraph: filename=pycallgraph-1.0.1-py3-none-any.whl size=35943 sha256=d0ee9415d7c268f6964f4a0fd1dc6ec3e039b6bedfe4844de6c1eb8fd0a61389 Stored in directory: /home/dechin/.cache/pip/wheels/c1/6c/a0/22b61ff9ca89881bb8d030ecd019b84697a39e7b187bc57938 Successfully built pycallgraph Installing collected packages: pycallgraph Successfully installed pycallgraph-1.0.1
用dot -v
指令驗(yàn)證一下graphviz是否安裝成功:
[dechin@dechin-manjaro callgraph]$ dot -v bash: dot:未找到命令
咦?明明參考的正確方法,graphviz
咋沒(méi)有裝上呢?經(jīng)過(guò)面向谷歌的編程技術(shù),發(fā)現(xiàn)了原來(lái)在系統(tǒng)上需要先安裝一個(gè)graphviz,這里展示的是Manjaro Linux平臺(tái)的安裝方法:
[dechin-manjaro callgraph]# pacman -S graphviz 正在解析依賴(lài)關(guān)系... 正在查找軟件包沖突... 軟件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.44.1-6 下載大?。? 9.74 MiB 全部安裝大?。?24.73 MiB :: 進(jìn)行安裝嗎? [Y/n] Y :: 正在獲取軟件包...... netpbm-10.73.33-1-x86_64 1867.1 KiB 6.51 MiB/s 00:00 [####################################] 100% gts-0.7.6.121130-2-x86_64 211.0 KiB 12.1 MiB/s 00:00 [####################################] 100% 錯(cuò)誤:無(wú)法從 mirrors.ustc.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 錯(cuò)誤:無(wú)法從 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 錯(cuò)誤:無(wú)法從 mirrors.huaweicloud.com : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 錯(cuò)誤:無(wú)法從 mirrors.sjtug.sjtu.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 錯(cuò)誤:無(wú)法從 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 錯(cuò)誤:無(wú)法從 mirrors.aliyun.com : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst' 警告:無(wú)法獲取某些文件 錯(cuò)誤:無(wú)法提交處理 (無(wú)法獲取某些文件) 發(fā)生錯(cuò)誤,沒(méi)有軟件包被更新。
咦?再一次遇到了問(wèn)題,配置了這么多鏡像源咋都安裝不上?再經(jīng)過(guò)一番面向谷歌的編程,發(fā)現(xiàn)更新一下源就可以用了:
[dechin-manjaro callgraph]# pacman -Syy :: 正在同步軟件包數(shù)據(jù)庫(kù)... core 165.3 KiB 1968 KiB/s 00:00 [####################################] 100% extra 1987.0 KiB 9.11 MiB/s 00:00 [####################################] 100% community 6.6 MiB 9.93 MiB/s 00:01 [####################################] 100% multilib 181.4 KiB 12.7 MiB/s 00:00 [####################################] 100% archlinuxcn 1596.1 KiB 1232 KiB/s 00:01 [####################################] 100%
再次嘗試安裝graphviz:
[dechin-manjaro callgraph]# pacman -S graphviz :: Some packages should be upgraded first... 正在解析依賴(lài)關(guān)系... 正在查找軟件包沖突... 軟件包 (2) archlinux-keyring-20210110-1 manjaro-system-20210217-1 下載大?。?0.95 MiB 全部安裝大?。?1.31 MiB 凈更新大小: 0.02 MiB :: 進(jìn)行安裝嗎? [Y/n] Y :: 正在獲取軟件包...... archlinux-keyring-20210110-1-any 950.2 KiB 4.96 MiB/s 00:00 [####################################] 100% manjaro-system-20210217-1-any 21.4 KiB 0.00 B/s 00:00 [####################################] 100% (2/2) 正在檢查密鑰環(huán)里的密鑰 [####################################] 100% (2/2) 正在檢查軟件包完整性 [####################################] 100% (2/2) 正在加載軟件包文件 [####################################] 100% (2/2) 正在檢查文件沖突 [####################################] 100% (2/2) 正在檢查可用存儲(chǔ)空間 [####################################] 100% :: 正在處理軟件包的變化... (1/2) 正在更新 archlinux-keyring [####################################] 100% ==> 正在從 archlinux.gpg 添加密匙... gpg: 公鑰 CF66D153D884358F 在其簽名之后的 16 秒生成 ==> 正在本地簽名密匙環(huán)中的可信密匙... -> 正在本地簽名密匙 AB19265E5D7D20687D303246BA1DFB64FFF979E7... -> 正在本地簽名密匙 DDB867B92AA789C165EEFA799B729B06A680C281... -> 正在本地簽名密匙 0E8B644079F599DFC1DDC3973348882F6AC6A4C2... -> 正在本地簽名密匙 D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C... -> 正在本地簽名密匙 91FFE0700E80619CEB73235CA88E23E377514E00... ==> 正在導(dǎo)入擁有者信任值... ==> 正在密匙環(huán)中禁用已激活密匙... -> 正在禁用密匙 4A8B17E20B88ACA61860009B5CED81B7C2E5C0D2... -> 正在禁用密匙 684148BB25B49E986A4944C55184252D824B18E8... -> 正在禁用密匙 5357F3B111688D88C1D88119FCF2CB179205AC90... -> 正在禁用密匙 50F33E2E5B0C3D900424ABE89BDCF497A4BBCC7F... -> 正在禁用密匙 39F880E50E49A4D11341E8F939E4F17F295AFBF4... -> 正在禁用密匙 F5A361A3A13554B85E57DDDAAF7EF7873CFD4BB6... -> 正在禁用密匙 40440DC037C05620984379A6761FAD69BA06C6A9... -> 正在禁用密匙 FB871F0131FEA4FB5A9192B4C8880A6406361833... -> 正在禁用密匙 487EACC08557AD082088DABA1EB2638FF56C0C53... -> 正在禁用密匙 76B4192E902C0A52642C63C273B8ED52F1D357C1... -> 正在禁用密匙 40776A5221EF5AD468A4906D42A1DB15EC133BAD... -> 正在禁用密匙 0B20CA1931F5DA3A70D0F8D2EA6836E1AB441196... -> 正在禁用密匙 07DFD3A0BC213FA12EDC217559B3122E2FA915EC... -> 正在禁用密匙 34C5D94FE7E7913E86DC427E7FB1A3800C84C0A5... -> 正在禁用密匙 B1F2C889CB2CCB2ADA36D963097D629E437520BD... -> 正在禁用密匙 D4DE5ABDE2A7287644EAC7E36D1A9E70E19DAA50... -> 正在禁用密匙 44D4A033AC140143927397D47EFD567D4C7EA887... -> 正在禁用密匙 8F76BEEA0289F9E1D3E229C05F946DED983D4366... -> 正在禁用密匙 27FFC4769E19F096D41D9265A04F9397CDFD6BB0... -> 正在禁用密匙 4FCF887689C41B09506BE8D5F3E1D5C5D30DB0AD... -> 正在禁用密匙 5A2257D19FF7E1E0E415968CE62F853100F0D0F0... -> 正在禁用密匙 7FA647CD89891DEDC060287BB9113D1ED21E1A55... -> 正在禁用密匙 5E7585ADFF106BFFBBA319DC654B877A0864983E... -> 正在禁用密匙 E7210A59715F6940CF9A4E36A001876699AD6E84... -> 正在禁用密匙 5559BC1A32B8F76B3FCCD9555FA5E5544F010D48... -> 正在禁用密匙 BFA1ECFEF1524EE4099CDE971F0CD4921ECAA030... -> 正在禁用密匙 4D913AECD81726D9A6C74F0ADA6426DD215B37AD... -> 正在禁用密匙 8840BD07FC24CB7CE394A07CCF7037A4F27FB7DA... -> 正在禁用密匙 BC1FBE4D2826A0B51E47ED62E2539214C6C11350... -> 正在禁用密匙 9515D8A8EAB88E49BB65EDBCE6B456CAF15447D5... -> 正在禁用密匙 779CD2942629B7FA04AB8F172E89012331361F01... -> 正在禁用密匙 D921CABED130A5690EF1896E81AF739EC0711BF1... -> 正在禁用密匙 5696C003B0854206450C8E5BE613C09CB4440678... -> 正在禁用密匙 8CF934E339CAD8ABF342E822E711306E3C4F88BC... -> 正在禁用密匙 1A60DC44245D06FEF90623D6EEEEE2EEEE2EEEEE... -> 正在禁用密匙 81D7F8241DB38BC759C80FCE3A726C6170E80477... -> 正在禁用密匙 63F395DE2D6398BBE458F281F2DBB4931985A992... -> 正在禁用密匙 65EEFE022108E2B708CBFCF7F9E712E59AF5F22A... -> 正在禁用密匙 66BD74A036D522F51DD70A3C7F2A16726521E06D... ==> 正在更新可信數(shù)據(jù)庫(kù)... gpg: 下次信任度數(shù)據(jù)庫(kù)檢查將于 2021-03-06 進(jìn)行 (2/2) 正在更新 manjaro-system [####################################] 100% :: 正在運(yùn)行事務(wù)后鉤子函數(shù)... (1/1) Arming ConditionNeedsUpdate... 正在解析依賴(lài)關(guān)系... 正在查找軟件包沖突... 軟件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.46.0-1 下載大小: 6.80 MiB 全部安裝大?。?23.32 MiB :: 進(jìn)行安裝嗎? [Y/n] Y :: 正在獲取軟件包...... graphviz-2.46.0-1-x86_64 6.8 MiB 7.03 MiB/s 00:01 [####################################] 100% (3/3) 正在檢查密鑰環(huán)里的密鑰 [####################################] 100% (3/3) 正在檢查軟件包完整性 [####################################] 100% (3/3) 正在加載軟件包文件 [####################################] 100% (3/3) 正在檢查文件沖突 [####################################] 100% (3/3) 正在檢查可用存儲(chǔ)空間 [####################################] 100% :: 正在處理軟件包的變化... (1/3) 正在安裝 netpbm [####################################] 100% (2/3) 正在安裝 gts [####################################] 100% (3/3) 正在安裝 graphviz [####################################] 100% graphviz 的可選依賴(lài) mono: sharp bindings guile: guile bindings lua: lua bindings ocaml: ocaml bindings perl: perl bindings [已安裝] python: python bindings [已安裝] r: r bindings tcl: tcl bindings [已安裝] qt5-base: gvedit [已安裝] gtk2: gtk output plugin [已安裝] xterm: vimdot :: 正在運(yùn)行事務(wù)后鉤子函數(shù)... (1/2) Arming ConditionNeedsUpdate... (2/2) Warn about old perl modules
Finally還是給我安裝成功了,接下來(lái)再看看dot
指令的執(zhí)行情況:
[dechin-manjaro callgraph]# dot -v dot - graphviz version 2.46.0 (0) libdir = "/usr/lib/graphviz" Activated plugin library: libgvplugin_dot_layout.so.6 Using layout: dot:dot_layout Activated plugin library: libgvplugin_core.so.6 Using render: dot:core Using device: dot:dot:core The plugin configuration file: /usr/lib/graphviz/config6 was successfully loaded. render : cairo dot dot_json fig gd json json0 map mp pic pov ps svg tk visio vml vrml xdot xdot_json layout : circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi textlayout : textlayout device : bmp canon cmap cmapx cmapx_np dot dot_json eps fig gd gd2 gif gtk gv ico imap imap_np ismap jpe jpeg jpg json json0 mp pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vdx vml vmlz vrml wbmp webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib loadimage : (lib) bmp eps gd gd2 gif ico jpe jpeg jpg png ps svg webp xbm
運(yùn)行示例
這里我們以上一篇博客量子計(jì)算模擬器生成隨機(jī)數(shù)中的案例,來(lái)測(cè)試一下pycallgraph的功能。源代碼可以參考源博客地址,這里我們直接展示下更改后的代碼:
# random_number.py from projectq import MainEngine from projectq.ops import H, Measure from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutput def random_number_generator(): eng = MainEngine() qubit = eng.allocate_qubit() H | qubit eng.flush() Measure | qubit random_number = int(qubit) eng.flush(deallocate_qubits=True) return random_number if __name__ == '__main__': graphviz = GraphvizOutput() graphviz.output_file = 'random_number_generator.png' with PyCallGraph(output=graphviz): random_number = random_number_generator() print('Random number generated by quantum simulator is:\ {}'.format(random_number))
其實(shí)pycallgraph的使用方法也非常的簡(jiǎn)單,只需要導(dǎo)入PyCallGraph
和GraphvizOutput
兩個(gè)模塊,然后把main
函數(shù)中所有需要運(yùn)行的正常流程的代碼,放到with PyCallGraph(output=graphviz)
里面即可。接下來(lái)運(yùn)行該文件:
[dechin@dechin-manjaro callgraph]$ python3 random_number.py Random number generated by quantum simulator is: 0
除了打印輸出,我們會(huì)發(fā)現(xiàn)在當(dāng)前目錄下生成了一個(gè)名為random_number_generator.png
的圖形文件,具體內(nèi)容打開(kāi)如下圖所示:
補(bǔ)充示例
考慮到上面的運(yùn)行示例結(jié)果比較龐大,這也是一個(gè)稍微大一些的軟件項(xiàng)目所面臨的重大困難。這里為了簡(jiǎn)明的展示pycallgraph
的功能,我們?cè)兕~外補(bǔ)充一個(gè)簡(jiǎn)單的示例:
# simple_calculation.py from pycallgraph import PyCallGraph from pycallgraph.output import GraphvizOutput def multiply(a, b): return a*b def plus(a, b): return a+b if __name__ == '__main__': graphviz = GraphvizOutput() graphviz.output_file = 'simple_calculation.png' with PyCallGraph(output=graphviz): a = 10 b = 2 print ('The value of a*b+b is: {}'.format(plus(multiply(a, b), b)))
這個(gè)案例的功能,僅僅是把加法和乘法進(jìn)行了函數(shù)的封裝,再在main
函數(shù)中調(diào)用,執(zhí)行結(jié)果和pycallgraph生成的圖片如下圖所示:
[dechin@dechin-manjaro callgraph]$ python3 simple_calculation.py The value of a*b+b is: 22
在這個(gè)示例中,我們就可以很清晰的看到這個(gè)執(zhí)行的文件的調(diào)用關(guān)系,其實(shí)就只是調(diào)用了multiply
和plus
兩個(gè)函數(shù)而已。
總結(jié)概要
使用pycallgraph
這個(gè)工具,可以幫助我們更好的入手去分析一個(gè)全新的軟件包。通過(guò)了解各個(gè)模塊之間的調(diào)用關(guān)系,我們還可以比較直觀的梳理出相關(guān)的架構(gòu)圖,帶著架構(gòu)的思維去逐層的分析相應(yīng)的軟件及其實(shí)現(xiàn)的方式。
版權(quán)聲明
本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/pycallgraph.html
作者ID:DechinPhy
更多原著文章請(qǐng)參考:https://www.cnblogs.com/dechinphy/
到此這篇關(guān)于使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析的文章就介紹到這了,更多相關(guān)python代碼函數(shù)調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python一些性能分析的技巧
- Python性能分析工具py-spy原理用法解析
- Python內(nèi)置類(lèi)型性能分析過(guò)程實(shí)例
- Python性能分析工具Profile使用實(shí)例
- cProfile Python性能分析工具使用詳解
- Python中判斷子串存在的性能比較及分析總結(jié)
- Python爬蟲(chóng)分析微博熱搜關(guān)鍵詞的實(shí)現(xiàn)代碼
- 使用bandit對(duì)目標(biāo)python代碼進(jìn)行安全函數(shù)掃描的案例分析
- python中delattr刪除對(duì)象方法的代碼分析
- python3中確保枚舉值代碼分析
- python如何做代碼性能分析
相關(guān)文章
Python first-order-model實(shí)現(xiàn)讓照片動(dòng)起來(lái)
本文將利用first-order-model實(shí)現(xiàn)讓照片動(dòng)起來(lái),除了表情驅(qū)動(dòng)照片,還可以姿態(tài)遷移。文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下2022-06-06TensorFlow入門(mén)使用 tf.train.Saver()保存模型
這篇文章主要介紹了TensorFlow入門(mén)使用 tf.train.Saver()保存模型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python爬蟲(chóng)之Selenium庫(kù)的使用方法
這篇文章主要介紹了Python爬蟲(chóng)之Selenium庫(kù)的使用方法,幫助大家更好的理解和使用爬蟲(chóng),感興趣的朋友可以了解下2021-01-01paramiko模塊安裝和使用(遠(yuǎn)程登錄服務(wù)器)
paramiko是用python語(yǔ)言寫(xiě)的一個(gè)模塊,遵循SSH2協(xié)議,支持以加密和認(rèn)證的方式,進(jìn)行遠(yuǎn)程服務(wù)器的連接,下面學(xué)習(xí)一下它的使用方法2014-01-01Python連接數(shù)據(jù)庫(kù)學(xué)習(xí)之DB-API詳解
在沒(méi)有 Python DB-API 之前,各數(shù)據(jù)庫(kù)之間的應(yīng)用接口非?;靵y,實(shí)現(xiàn)各不相同。如果項(xiàng)目需要更換數(shù)據(jù)庫(kù)時(shí),則需要做大量的修改,非常不便。Python DB-API 的出現(xiàn)就是為了解決這樣的問(wèn)題。本文主要介紹了Python連接數(shù)據(jù)庫(kù)之DB-API的相關(guān)資料,需要的朋友可以參考。2017-02-02python logging.info在終端沒(méi)輸出的解決
這篇文章主要介紹了python logging.info在終端沒(méi)輸出的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python網(wǎng)絡(luò)編程 Python套接字編程
這篇文章主要為大家詳細(xì)介紹了Python網(wǎng)絡(luò)編程的相關(guān)資料,Python套接字編程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Python中Tkinter Scrollbar滾動(dòng)條(窗口滑動(dòng)條)
本文主要介紹了Python中Tkinter Scrollbar滾動(dòng)條(窗口滑動(dòng)條),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03