python绘制函数调用图总结:pycallgraph系列
介绍
pycallgraph系列库可用于可视化函数调用关系,学习意外发现也会显示函数调用的次数和时间,输出的格式测试过png,pdf和svg三种,貌似只有png可以正常查看,所以还是推荐png格式的输出。其他参数方面主要有可以设置调用的深度、忽略特定的函数。在一个大型的项目中可以忽略特定的函数真的很方便,特别是那些耗时很少的函数。
安装
下载graphviz,安装时可以选择添加环境变量,重启后生效。
查询发现pycallgraph库有多个版本,但都不再维护了。其中通过pip安装最方便的是pycallgraph2,支持python2.x和python3.x,而pycallgraph3仅支持python3.x,更新截止到2022年。另外有一个更新的类似分支的库python-call-graph,用法与pycallgraph系列基本相同。
#可正常安装,pycallgraph和pycallgraph3都无法直接安装
pip install pycallgraph2 -i https://pypi.tuna.tsinghua.edu.cn/simple
示例
虽然可以通过命令行运行,但是个人觉得不太实用,下面展示官方代码示例和一些笔记。
from pycallgraph2 import PyCallGraph
from pycallgraph2.output import GraphvizOutput
from pycallgraph2 import Config
from pycallgraph2 import GlobbingFilter
class Banana:
def __init__(self):
pass
def eat(self):
self.secret_function()
self.chew()
self.swallow()
def secret_function(self):
time.sleep(0.2)
def chew(self):
pass
def swallow(self):
pass
# 测试发现不分组更有层次感,不会有错乱的线条交织着
config = Config(
groups=True, # 设置是否分组
max_depth=3, # 设置可视化函数调用的最大深度
)
# exclude参数指定排除的函数,可以使用通配符
# include参数指定要包含的函数,可以使用通配符
config.trace_filter = GlobbingFilter(
exclude=[
'pycallgraph.*',
'*.secret_function',
],
include=[
'main',
]
)
# 设置GraphvizOutput输出为PNG格式
graphviz = GraphvizOutput(
output_file='test.png'
)
# 使用PyCallGraph生成调用图,将需要分析的主函数写在下面即可
with PyCallGraph(output=graphviz, config=config):
banana = Banana()
banana.eat()