技术背景

在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等。但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块。只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能。这里我们就引入一个工具pycallgraph,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数、类的关系图,让我们一起来了解下这个工具的安装和使用方法。

Manjaro平台安装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,这两者有先后的依赖关系:

[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指令验证一下graphviz是否安装成功:

[dechin@dechin-manjaro callgraph]$ dot -v
bash: dot:未找到命令

咦?明明参考的正确方法,graphviz咋没有装上呢?经过面向谷歌的编程技术,发现了原来在系统上需要先安装一个graphviz,这里展示的是Manjaro Linux平台的安装方法:

[dechin-manjaro callgraph]# pacman -S graphviz
正在解析依赖关系...
正在查找软件包冲突... 软件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.44.1-6 下载大小: 9.74 MiB
全部安装大小: 24.73 MiB :: 进行安装吗? [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%
错误:无法从 mirrors.ustc.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.huaweicloud.com : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.sjtug.sjtu.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
错误:无法从 mirrors.aliyun.com : The requested URL returned error: 404 获取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
警告:无法获取某些文件
错误:无法提交处理 (无法获取某些文件)
发生错误,没有软件包被更新。

咦?再一次遇到了问题,配置了这么多镜像源咋都安装不上?再经过一番面向谷歌的编程,发现更新一下源就可以用了:

[dechin-manjaro callgraph]# pacman -Syy
:: 正在同步软件包数据库...
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...
正在解析依赖关系...
正在查找软件包冲突... 软件包 (2) archlinux-keyring-20210110-1 manjaro-system-20210217-1 下载大小: 0.95 MiB
全部安装大小: 1.31 MiB
净更新大小: 0.02 MiB :: 进行安装吗? [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) 正在检查密钥环里的密钥 [####################################] 100%
(2/2) 正在检查软件包完整性 [####################################] 100%
(2/2) 正在加载软件包文件 [####################################] 100%
(2/2) 正在检查文件冲突 [####################################] 100%
(2/2) 正在检查可用存储空间 [####################################] 100%
:: 正在处理软件包的变化...
(1/2) 正在更新 archlinux-keyring [####################################] 100%
==> 正在从 archlinux.gpg 添加密匙...
gpg: 公钥 CF66D153D884358F 在其签名之后的 16 秒生成
==> 正在本地签名密匙环中的可信密匙...
-> 正在本地签名密匙 AB19265E5D7D20687D303246BA1DFB64FFF979E7...
-> 正在本地签名密匙 DDB867B92AA789C165EEFA799B729B06A680C281...
-> 正在本地签名密匙 0E8B644079F599DFC1DDC3973348882F6AC6A4C2...
-> 正在本地签名密匙 D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C...
-> 正在本地签名密匙 91FFE0700E80619CEB73235CA88E23E377514E00...
==> 正在导入拥有者信任值...
==> 正在密匙环中禁用已激活密匙...
-> 正在禁用密匙 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...
==> 正在更新可信数据库...
gpg: 下次信任度数据库检查将于 2021-03-06 进行
(2/2) 正在更新 manjaro-system [####################################] 100%
:: 正在运行事务后钩子函数...
(1/1) Arming ConditionNeedsUpdate... 正在解析依赖关系...
正在查找软件包冲突... 软件包 (3) gts-0.7.6.121130-2 netpbm-10.73.33-1 graphviz-2.46.0-1 下载大小: 6.80 MiB
全部安装大小: 23.32 MiB :: 进行安装吗? [Y/n] Y
:: 正在获取软件包......
graphviz-2.46.0-1-x86_64 6.8 MiB 7.03 MiB/s 00:01 [####################################] 100%
(3/3) 正在检查密钥环里的密钥 [####################################] 100%
(3/3) 正在检查软件包完整性 [####################################] 100%
(3/3) 正在加载软件包文件 [####################################] 100%
(3/3) 正在检查文件冲突 [####################################] 100%
(3/3) 正在检查可用存储空间 [####################################] 100%
:: 正在处理软件包的变化...
(1/3) 正在安装 netpbm [####################################] 100%
(2/3) 正在安装 gts [####################################] 100%
(3/3) 正在安装 graphviz [####################################] 100%
graphviz 的可选依赖
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
:: 正在运行事务后钩子函数...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Warn about old perl modules

Finally还是给我安装成功了,接下来再看看dot指令的执行情况:

[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

运行示例

这里我们以上一篇博客量子计算模拟器生成随机数中的案例,来测试一下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))

其实pycallgraph的使用方法也非常的简单,只需要导入PyCallGraphGraphvizOutput两个模块,然后把main函数中所有需要运行的正常流程的代码,放到with PyCallGraph(output=graphviz)里面即可。接下来运行该文件:

[dechin@dechin-manjaro callgraph]$ python3 random_number.py
Random number generated by quantum simulator is: 0

除了打印输出,我们会发现在当前目录下生成了一个名为random_number_generator.png的图形文件,具体内容打开如下图所示:

总结概要

使用pycallgraph这个工具,可以帮助我们更好的入手去分析一个全新的软件包。通过了解各个模块之间的调用关系,我们还可以比较直观的梳理出相关的架构图,带着架构的思维去逐层的分析相应的软件及其实现的方式。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pycallgraph.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

使用pycallgraph分析python代码函数调用流程以及框架的更多相关文章

  1. Python 控制流代码混淆简介,加大别人分析你代码逻辑和流程难度

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  2. 使用SonarQube+Eclipse来分析python代码

    背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...

  3. 利用graphviz软件和pycallgraph库自动生成Python代码函数调用关系图

    参考博文:https://blog.csdn.net/qq_36408085/article/details/82952846 https://blog.csdn.net/fondax/article ...

  4. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  5. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  6. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  7. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  8. 如何使用 Pylint 来规范 Python 代码风格

    如何使用 Pylint 来规范 Python 代码风格 转载自https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/   Pylint 是什么 ...

  9. python 代码检测工具

    对于我这种习惯了 Java 这种编译型语言,在使用 Python 这种动态语言的时候,发现错误经常只能在执行的时候发现,总感觉有点不放心. 而且有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导 ...

随机推荐

  1. CF 1326 D. Prefix-Suffix Palindrome

    D. Prefix-Suffix Palindrome 题意 给一个字符串 s,求一个字符串 t,t 由 s 的某个前缀以及某个后缀拼接而成,且 t 是回文串,长度不能超过 s.输出最长的 t 分析 ...

  2. HDU6321 Dynamic Graph Matching【状压DP 子集枚举】

    HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...

  3. CodeForces - 1100E 二分+拓扑排序

    题意: 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权. Inpu ...

  4. L2-019 悄悄关注 (25分) map容器模拟

    代码: 1 //一道模拟水题,就用来给map练手吧 2 #include<stdio.h> 3 #include<string.h> 4 #include<iostrea ...

  5. Promise nested then execute order All In One

    Promise nested then execute order All In One Promise nested then nested Promise not return new Promi ...

  6. convert URL Query String to Object All In One

    convert URL Query String to Object All In One URL / query string / paramas query string to object le ...

  7. LeetCode 算法题解 js 版 (001 Two Sum)

    LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...

  8. WebXR All in One

    WebXR All in One VR / WebVR WebXR https://www.w3.org/TR/webxr/ WebXR Device API https://immersiveweb ...

  9. foreign language learning

    foreign language learning free online learning websites 多邻国 https://www.duolingo.com 忆术家 https://www ...

  10. taro external-class

    taro external-class https://nervjs.github.io/taro/docs/component-style.html externalClasses child co ...