技术背景

在上一篇博客中,我们介绍了使用量子计算模拟器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-1333F Kate and imperfection

    F. Kate and imperfection 假设一个一个的往集合里面放元素,显然在放某个元素之前,我们不想让它的倍数已经在集合里面.因为在这之前,我们不如先把这个数放进去,再把它的倍数放进去更优 ...

  2. [CF套题] CF-1201

    CF-1201 传送门 # = * A 500 B 1000 C 1500 D 2000 E1 2000 E2 1000 1 (2217) 1672 482 00:09 400 01:40 790 0 ...

  3. 【noi 2.6_687】Color Tunnels(DP)

    P.S.o(︶︿︶)o 唉~虽然这题方程不难,但题目长,代码长,我花了超过3小时!(>﹏<)悲伤辣么大~~~ 谨此题解惠及众人,hh. 题意:给定长度为M的一串颜色序列,和平面上的N个颜色 ...

  4. 放苹果 POJ - 1664 递推

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t < ...

  5. [POJ 2585] Window Pains 拓朴排序

    题意:你现在有9个2*2的窗口在4*4的屏幕上面,由于这9这小窗口叠放顺序不固定,所以在4*4屏幕上有些窗口只会露出来一部分. 如果电脑坏了的话,那么那个屏幕上的各小窗口叠放会出现错误.你的任务就是判 ...

  6. python中is,== 和 in 的区别

    python对象的三个基本要素:id(身份标识),type(数据类型)和value(值). is 运算符:判断的是对象间的唯一身份标识(id). == 运算符:判断的是对象间的value(值)是否相同 ...

  7. 2.Url重定向和重写

    虚拟地址===>真实地址映射(搜索引擎优化,抽象能力,防盗链) 之前:IIS重写模块规则,Apache mod_Rewrite.Nginx上的URL重写. 现在:通过中间件来实现. 重定向与重写 ...

  8. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...

  9. HLOD System

    1.1 HLOD System简介 首先,HLOD System主要的目标是为了减少Draw Call.然后,进行更多的Batch批处理,从而大大提高渲染性能,减少面数和纹理,这样我们相应地节省了内存 ...

  10. IT-ebooks free download website & IT 电子书籍免费下载网站

    free ebooks of programming 1. http://www.it-ebooks.info/ http://www.it-ebooks-api.info/ 2. http://ww ...