技术背景

在上一篇博客中,我们介绍了使用量子计算模拟器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. 【Azure Redis 缓存】如何得知Azure Redis服务有更新行为?

    问题描述 Azure Redis作为微软云提供的一种PaaS服务,由于PaaS的特性,服务端的安装和维护.修补.升级等操作均由平台放负责.虽然最终用户只需要关注当前服务的使用,但是后台的升级和补丁行为 ...

  2. P1091 合唱队形(LIS)

    题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,-,K1,2, ...

  3. codeforces632E. Thief in a Shop (dp)

    A thief made his way to a shop. As usual he has his lucky knapsack with him. The knapsack can contai ...

  4. codeforces 86D D. Powerful array

    An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, a ...

  5. 牛客编程巅峰赛S1第5场 - 青铜&白银 B.完全平方数的尾巴 (暴力)

    题意:有一个数\(x\),判断其是否能有某个完全平方数$mod$1000得到. 题解:直接写个for判断一下就好了,因为对1000取模,所以枚举到1000即可. 代码: class Solution ...

  6. 1.ASP.NET Core 管道、中间件、依赖注入

    自定义中间件(基于工厂) 自定义中间件(注入到第三方容器)

  7. PHP的常用函数 持续更新

    PHP的常用函数 前言: 由于害怕遗忘,故在此记录下常用的php函数,以便复习 1 define函数 作用:定义常量 用法 <?php define('a',100); ?> 2 intv ...

  8. hihocoder 1631

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU campus. They are all happy ...

  9. 秋招C++面试相关总结索引

    C++相关 C++ part1 C++ part2 C++ part3 C++ part4 C++ part5 C++ part6 C++ part6.5 C++ part7 C++ part8 C+ ...

  10. MYSQL基础常见常用语句200条

    数据库 # 查看所有的数据库 SHOW DATABASES ; # 创建一个数据库 CREATE DATABASE k; # 删除一个数据库 DROP DATABASE k; # 使用这个数据库 US ...