使用pycallgraph和graphviz查看函数调用图

简介: 使用pycallgraph和graphviz查看函数调用图

前言


对于python开发者而言,我们常常会遇到这样的问题:当代码很长,或者代码的整体逻辑混乱的时候,调试代码就会非常困难,如果有一个模块能把代码的结构可视化,对开发者而言就会带来很大的便利。pycallgraph和graphviz就可以实现这一效果,生成函数调用图。


一、pycallgraph是什么?


Python Call Graph成为了Python应用程序的可视化分析工具。它使用一个名为sys.set_trace()的调试Python函数,该函数在您的代码每次进入或离开函数时都会进行回调。这样,Python调用图就可以跟踪每个被调用函数的名称,以及哪个函数被调用,哪个函数花费的时间,调用次数等。


它能够生成不同类型的输出和可视化。最初,Python Call Graph仅用于生成GraphViz的DOT文件,从1.0.0版开始,它还可以生成JSON文件和Gephi的GDF文件。通过对Output类进行子类化,创建自定义输出相当容易。

Graphviz是开源的图形可视化软件。它具有几个主要的图形布局程序。


二、使用步骤


1.安装步骤


安装pycallgraph

pip install pycallgraph

安装graphviz

http://www.graphviz.org/download/

选择合适版本安装,安装过程中需要选择添加环境变量

11.png

12.png

安装完成后检查环境变量:

13.png

命令行查看是否可以使用以及安装位置

14.png

vscode中使用需要添加环境变量:


ctrl + shift + P 快捷键打开

15.png

打开后,如图加入环境变量,即可使用了。

16.png

2.引入库


代码如下(示例):

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
class Banana:
    def eat(self):
        pass
class Person:
    def __init__(self):
        self.no_bananas()
    def no_bananas(self):
        self.bananas = []
    def add_banana(self, banana):
        self.bananas.append(banana)
    def eat_bananas(self):
        [banana.eat() for banana in self.bananas]
        self.no_bananas()
def main():
    graphviz = GraphvizOutput()
    graphviz.output_file = 'basic.png'
    with PyCallGraph(output=graphviz):
        person = Person()
        for a in range(10):
            person.add_banana(Banana())
        person.eat_bananas()
if __name__ == '__main__':
    main()

17.png

下面是效果图:

18.png

3.进阶使用


过滤器


• include 流程图中只包含能和include定义内容匹配上的函数


• exclude 流程图中不包含能和include定义内容匹配上的函数


• max_depth 保留调用层级

from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph import GlobbingFilter
from pycallgraph.output import GraphvizOutput
from banana import Banana
config = Config()
config.trace_filter = GlobbingFilter(exclude=[
    'pycallgraph.*',
    '*.secret_function',
])
graphviz = GraphvizOutput(output_file='filter_exclude.png')
with PyCallGraph(output=graphviz, config=config):
    banana = Banana()
    banana.eat()
from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph.output import GraphvizOutput
from banana import Banana
config = Config(max_depth=1)
graphviz = GraphvizOutput(output_file='filter_max_depth.png')
with PyCallGraph(output=graphviz, config=config):
    banana = Banana()
    banana.eat()
目录
相关文章
|
缓存 编译器
BOLT 二进制反馈优化技术
大型应用的代码往往达到数十甚至上百MB,这导致在程序执行时缓存机制无法充分利用,导致大量时间花费在CPU和内存链路上。通过对热点函数的布局进行优化,我们可以更好地利用CPU cache,从而获得较为可观的性能提升。针对这一问题,在编译技术上有PGO和Bolt两种解决办法,两者都是一种通过收集程序在运行时如跳转,调用关系,函数热度等执行信息,这些收集到的程序运行情况数据(profile data),可以更好地指导一些程序优化的策略,如是否对函数进行内联,以及对基本块和函数布局的排布来提高特定场景下的程序性能。
2452 2
BOLT 二进制反馈优化技术
|
存储 缓存 数据可视化
(七)解析Streamlit的数据元素:探索st.dataframe、st.data_editor、st.column_config、st.table、st.metric和st.json的神奇之处(上)
(七)解析Streamlit的数据元素:探索st.dataframe、st.data_editor、st.column_config、st.table、st.metric和st.json的神奇之处
6334 0
|
数据可视化 Python
pycallgraph,一个好用的 Python 代码可视化库!
pycallgraph,一个好用的 Python 代码可视化库!
1003 7
|
8月前
|
存储 安全 算法
即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具
本文详细讨论了硬编码密码的成因、危害及治理方法,同时本文从安全人员的角度出发,对现有的硬编码密码检测工具的算法进行了深入调研,并提出了我们的自动化检测工具。
256 7
|
7月前
|
人工智能 自然语言处理 前端开发
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
本文介绍如何使用Spring Boot3与Vue2快速构建基于DeepSeek的AI对话系统。系统具备实时流式交互、Markdown内容渲染、前端安全防护等功能,采用响应式架构提升性能。后端以Spring Boot为核心,结合WebFlux和Lombok开发;前端使用Vue2配合WebSocket实现双向通信,并通过DOMPurify保障安全性。项目支持中文语义优化,API延迟低,成本可控,适合个人及企业应用。跟随教程,轻松开启AI应用开发之旅!
|
10月前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
3365 7
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
26706 1
|
人工智能 自然语言处理 文字识别
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用
在7月4日举行的WAIC 2024科学前沿主论坛上,书生·浦语2.5正式发布,面向大模型研发与应用的全链条工具体系同时迎来升级。
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用
|
开发框架 编译器 定位技术
探索游戏开源世界:引擎与框架的宝库
本文介绍了多个开源游戏引擎和框架,如 Bevy(用 Rust 构建)、Mach、Axmol、Cocos、Open 3D Engine、KorGE、Tiled、OpenRA 和 Godot。这些工具降低了游戏开发的门槛,支持跨平台开发,并推动了游戏行业的发展。