python函数调用关系分析
在Pycharm的专业版中,提供了一个分析项目性能的工具run->Profile
,可以将工程运行时各函数的调用次数和所用时间记录下来,提供静态数据和关系图表两种表达方式。
只需轻轻一点,统计数据和图表关系一览无遗,确实方便。但是此方法局限性很大,一是必须使用pycharm,这样使用其他ide如VS Code的用户就没法使用了;二是它不仅要使用pychram,还得是专业版,专业版是要收费的(破解和学生版除外),这又是一道坎挡在了我们的路上。那么有其他的方法来进行类似的分析吗?当然是有的。
profile
profile可以分析函数运行时的性能消耗情况,调用方法如下:
import profile
profile.run("main()")
main()即为需要分析的入口函数,以字符串形式传入。运行之后可以得到如下的输出:
19 function calls in 0.000 secondsOrdered by: standard namencalls tottime percall cumtime percall filename:lineno(function)1 0.000 0.000 0.000 0.000 :0(exec)4 0.000 0.000 0.000 0.000 :0(len)4 0.000 0.000 0.000 0.000 :0(print)1 0.000 0.000 0.000 0.000 :0(setprofile)2 0.000 0.000 0.000 0.000 :0(sleep)1 0.000 0.000 0.000 0.000 <string>:1(<module>)1 0.000 0.000 0.000 0.000 profile:0(main())0 0.000 0.000 profile:0(profiler)1 0.000 0.000 0.000 0.000 test.py:1(next_cal)1 0.000 0.000 0.000 0.000 test.py:16(__init__)1 0.000 0.000 0.000 0.000 test.py:19(search_string)1 0.000 0.000 0.000 0.000 test.py:36(__next_arr)1 0.000 0.000 0.000 0.000 test.py:51(main)
虽然函数调用情况可以得到的,但是分析起来比较麻烦,函数之间的调用关系也没有给出。此方式虽然简单但是不够直观。
pycallgraph
在pycallgraph之前不得不先提及一下**Graphviz**,毕竟pycallgraph是基于Graphviz的。Graphviz是开源的图形可视化软件,能够将结构信息表示为抽象图和网络图的方法。至官网下载并安装Graphviz:http://www.graphviz.org/download/,同时在将graphviz\bin
添加到环境变量中。graphviz中有多种布局器,pycallgraph所使用的便是其中的dot.
dot 默认布局方式,主要用于有向图
neato 基于spring-model(又称force-based)算法
twopi 径向布局
circo 圆环布局
fdp 用于无向图
看看graphviz都能画些什么样的图:
安装并配置好graphviz后,需要安装pycallgraph,直接使用pip安装即可:
pip install pycallgraph
之后可以通过命令行或代码来生成函数调用关系图。
命令行(windows中不识别pycallgraph,应该还要需要配置其环境变量):
pycallgraph graphviz -- ./main.py
code:
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput(output_file="test.png")):main()
当然可以配置显示或不显示哪些函数:
from pycallgraph import Config
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
config = Config()
# 关系图中包括(include)哪些函数名。
# 如果是某一类的函数,例如类gobang,则可以直接写'gobang.*',表示以gobang.开头的所有函数。(利用正则表达式)。
# config.trace_filter = GlobbingFilter(include=[
# 'draw_chessboard',
# 'draw_chessman',
# 'draw_chessboard_with_chessman',
# 'choose_save',
# 'choose_turn',
# 'choose_mode',
# 'choose_button',
# 'save_chess',
# 'load_chess',
# 'play_chess',
# 'pop_window',
# 'tip',
# 'get_score',
# 'max_score',
# 'win',
# 'key_control'
# ])
# 该段作用是关系图中不包括(exclude)哪些函数。(正则表达式规则)
# config.trace_filter = GlobbingFilter(exclude=[
# 'pycallgraph.*',
# '*.secret_function',
# 'FileFinder.*',
# 'ModuleLockManager.*',
# 'SourceFilLoader.*'
# ])
graphviz = GraphvizOutput()
graphviz.output_file = 'test.png'
with PyCallGraph(output=graphviz, config=config):main()
运行后再当前目录下生成test.png文件绘制了函数调用关系(默认文件名是pycallgraph.png):
class GraphvizOutput(Output):def __init__(self, **kwargs):self.tool = 'dot'self.output_file = 'pycallgraph.png'self.output_type = 'png'self.font_name = 'Verdana'self.font_size = 7self.group_font_size = 10self.group_border_color = Color(0, 0, 0, 0.8)Output.__init__(self, **kwargs)self.prepare_graph_attributes()
可见此方式对函数的调用关系展示得较为清晰明了,其缺点是制作的图分辨率不高,略显模糊。下为yolov5的调用关系图。
cProfile+snakeviz
使用cProfie可以将函数运行分析结果保存为.prof文件,然后使用其他工具进行可视化,此处以snakeviz为例。
cProfile
使用cProfile分析工程,可以使用命令行和代码两种方式。
- cmd
python -m cProfile -o result.prof test.py
- code
import cProfile
cProfile.run("main()", filename='result.prof')
不推荐使用命令行形式,针对,整个文件,会打包过多的无用函数,影响观感。使用code方式针对特定函数分析即可。
snakeviz
安装snakeviz:
pip install snakeviz
直接调用cProfile生成的文件,在浏览器中可以打开交互式网页,查看分析结果。缺点:虽然能够从图中获知函数调用顺序,但是函数调用关系依旧不够直观。
,影响观感。使用code方式针对特定函数分析即可。
python函数调用关系分析相关推荐
- 函数调用关系python_追踪python函数调用关系
在我们执行拥有复杂函数调用关系的一段python程序时,我们希望能够清楚的知道他们之间的调用关系以及在调用过程中传入的参数信息和返回值,这些信息对于我们分析程序的行为和bug会很有帮助. 我希望能实现 ...
- Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚运行着的task其输入的数据从哪获取,处理的结果返回到哪里,如何返回. 准备 spark已经安装完毕 ...
- Nginx的主要函数调用关系分析
感觉上次写的: http://blog.csdn.net/houjixin/article/details/59658022 这篇总结没把Nginx最主要的函数调用关系说清楚,因此,这次又重新组织了一 ...
- 【Python】利用graphviz和pycallgraph库自动生成Python函数调用关系图
一.下载并安装graphviz 因为这个模块依赖Graphviz2.38这个软件,这个贝尔实验室大牛为画图提供的一个命令行工具. 下载地址:https://graphviz.gitlab.io/_pa ...
- c语言调用graphviz_c语言分析函数调用关系图(call graph)的几种方法
一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...
- [Python] 绘制Python代码的函数调用关系:graphviz+pycallgraph
[Python] 绘制Python代码的函数调用关系:graphviz+pycallgraph 文章目录 [Python] 绘制Python代码的函数调用关系:graphviz+pycallgraph ...
- [授权发表]源码分析:静态分析 C 程序函数调用关系
故事缘由 工欲善其事,必先利其器.今天我们来玩转一个小工具,叫 Callgraph,它可以把 C 语言的函数调用树(或者说流程图)画出来. 传统的命令行工具 Cscope,Ctags 可以结合vim ...
- python网络数据爬取及分析_《Python网络数据采集》读后总结--第3章开始爬取数据及天善用户关系分析实例...
这次介绍一下<Python网络数据采集>这本书的第3章内容(Chpt03.开始爬数据的内容), 使用了天善用户关系分析的示例来介绍一下具体实践. 1.第3章内容简介 1-getWikiLi ...
- 导出python源码的函数调用关系图的方法
导出python源码的函数调用关系图的方法 1. pycallgraph+graphviz 2. pyreverse+graphviz 3. pycharm(推荐) 4. starUML 5. Ent ...
最新文章
- JMeter入门(1):JMeter总体介绍及组件介绍
- 2.使用Connection对象连接数据库
- http://www.jb51.net/list/list_233_2.htm(导航: 首页 软件编程 Android)
- VTK:Utilities之GetClassName
- 总线协议之I2C总线时序
- SAP HANA Database Explorer 里 SQL console 的用法
- 论文学习7-Spam Review Detection with Graph Convolutional Networks(阿里巴巴)
- Python Pytest装饰器@pytest.mark.parametrize用例数据驱动(三)
- VMware pro 15 ubuntu简易安装虚拟机黑屏
- NeurIPS2019无人驾驶研究成果大总结(含大量论文及项目数据)
- android 打印流程图,Android实现Activities之间进行数据传递的方法
- 不高兴INTEL挤牙膏,技术天才Jim Keller愤而辞职
- Ubuntu上下载百度网盘资料
- 为什么老工程师不值钱了
- ASO关键词覆盖怎么做?要做到多少?怎么提升aso关键词覆盖率
- 【Bugs】Hbase:File system needs to be upgraded. You have version null and I want version(habse缓冲问题)
- pass parameters to view(参数视图)
- 如果你想学数据科学,这 7 类资源千万不能错过...
- CTF--PWN必备技能--理解c程序从编译开始到运行结束的过程
- AI绘画能取代设计师吗?
热门文章
- 小程序+动易SF制作随手拍实例全景式操作(1)
- 第19章 项目收尾管理
- 软件开发过程反思——从需求分析到最后开发出来的软件
- java.lang.AssertionError: Activity needs to be set if initial lifecycle state is resumed
- 循环-05. 兔子繁衍问题(15)
- 用程序阻止计算机睡眠,PreventTurnOff防止电脑休眠工具|win10电脑防止屏幕休眠软件_最火软件站...
- lms语音降噪matlab实现_ANC主动降噪理论及Matlab代码实现
- HIVE常用参数配置
- QoS服务质量二令牌桶算法及QoS业务分类
- 刚刚装好的ppt插件islide消失了,如何解决呢?