利用viztracer进行性能分析和优化

上一篇文章,我们详细讲解了scalene这个性能分析和优化工具的使用流程;今天,我们将深入探讨另一个性能分析和优化工具——viztracer

什么是viztracer

viztracer是一个非常强大的分析器,可以生成详细的性能报告和可视化图表,它提供了许多强大的功能,包括:

  • 高精度的CPU和内存分析
  • 支持采样和分析Python代码的内存分配
  • 提供详细的性能报告和可视化图表

这些特性使得viztracer成为开发者进行性能调优的利器。

安装viztracer

首先,我们需要安装viztracer,可以通过pip进行安装:

pip3 install viztracer

安装完成后,可以通过命令行工具viztracer进行使用。

使用viztracer进行性能分析

假设我们有一个名为scalene_data.py 的Python脚本:

import time
import numpy as np

def compute(data):
    result = []
    for item in data:
        result.append(np.sin(item) ** 2 + np.cos(item) ** 2)
    return result

def main():
    data = np.random.rand(1000000)
    start_time = time.time()
    compute(data)
    print(f"Computation took {time.time() - start_time} seconds")

if __name__ == "__main__":
    main()

我们可以使用viztracer对其进行分析:

viztracer scalene_data.py

viztracer将生成一个.json后缀的文件,需要viztracer自带的软件vizviewer来打开,显示每行代码的CPU和内存使用情况:

生成详细的性能报告

viztracer不仅可以生成命令行报告,还可以生成详细的HTML报告,方便查看和分析,使用以下命令可以生成并打开HTML报告:

viztracer -o result.html scalene_data.py

执行完上述命令后,可以在浏览器中直接打开result.html文件,查看详细的性能报告,不需要使用viztracer提供的查看工具;报告中包含了每个函数的执行时间、调用次数、内存使用情况等信息,非常直观:

详细分析性能报告

打开生成的HTML报告后,我们可以看到以下内容:

  • 概览图表:显示程序执行的总体情况,包括总时间、函数调用次数等;
  • 时间轴视图:展示程序在时间维度上的执行情况,帮助识别性能瓶颈;
  • 函数调用图:显示各个函数的调用关系和执行时间,帮助深入分析具体问题。

通过这些详细的报告,我们可以快速定位代码中的性能瓶颈,例如,如果process_data函数的执行时间较长,我们可以考虑对其进行优化。

优化示例

通过viztracer的报告,我们可以轻松识别出性能瓶颈。例如,假设报告显示process_data函数的性能可以进一步优化,我们可以尝试使用NumPy的向量化操作来提高性能:

import time
import numpy as np

def compute(data):
    return np.sin(data) ** 2 + np.cos(data) ** 2

def main():
    data = np.random.rand(1000000)
    start_time = time.time()
    compute(data)
    print(f"Computation took {time.time() - start_time} seconds")

if __name__ == "__main__":
    main()

再次运行viztracer,生成新的性能报告,比较优化前后的性能差异:

viztracer -o result.html scalene_data_optimi.py

通过对比报告,可以看到优化后的代码在执行时间和资源使用方面有显著改善,没有耗时非常长的代码句了:

深入优化与高级技巧

除了上述基本的优化方法外,viztracer还提供了一些高级技巧,帮助我们进一步提升代码性能:

  • 自定义事件追踪:我们可以使用viztracer提供的API自定义事件追踪。例如,我们可以在关键代码段添加追踪事件,了解这些代码段的执行时间:

    from viztracer import VizTracer
    
    tracer = VizTracer()
    tracer.start()
    
    # 关键代码段
    result = process_data(data) 
    
    tracer.stop()
    tracer.save("result.json")
    
  • 动态追踪viztracer支持动态追踪,允许我们在程序运行时动态开启和关闭追踪,这样可以减少不必要的性能开销,只追踪我们感兴趣的部分:

    from viztracer import get_tracer
    
    tracer = get_tracer()
    tracer.start()
    
    # 需要追踪的代码段
    result = process_data(data)
    
    tracer.stop()
    
  • 多线程和多进程支持viztracer支持多线程和多进程应用的性能分析,通过在多线程或多进程代码中使用viztracer,我们可以详细了解每个线程或进程的性能情况,进一步优化并发程序:

    from concurrent.futures import ThreadPoolExecutor
    from viztracer import VizTracer
    
    def thread_task(data):
        return process_data(data)
    
    with VizTracer() as tracer:
        with ThreadPoolExecutor(max_workers=4) as executor:
            results = list(executor.map(thread_task, [data1, data2, data3, data4]))
    

总结

通过本文的介绍,我们学习了如何利用 viztracer 对 Python 程序进行性能分析和优化,大家可以将它与上一篇文章中介绍的 Py-Spy 、scalene进行比较,根据实际应用场景选择适合的工具。希望这些技巧能帮助你们在实际项目中编写出高效、稳定的代码!

如果你对计算机相关技术感兴趣,并且想要持续探索更多内容,请关注我的公众号!我们会持续分享更多精彩的技术干货!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信号与系统实验-实验五 离散时间系统的时域分析

一、实验目的 1、理解离散信号的定义与时域特征,掌握在时域求解信号的各种变换运算; 2、掌握离散系统的单位响应及其 MATLAB 实现的方法; 3、掌握离散时间序列卷积及其 MATLAB 实现的方法; 4、掌握利用 MATLAB 求解微分方程&a…

国内有哪些比较优秀的wordpress主题?

WordPress作为全球最受欢迎的开源内容管理系统之一,拥有众多优质的主题供用户选择。那么国内有哪些比较优秀的wordpress主题呢?下面小编就和大家分享国内功能比较完善比较受欢迎的wordpress主题。 wordpress主题合集:WP主题-办公人导航https:…

力扣1541. 平衡括号字符串的最少插入次数

Problem: 1541. 平衡括号字符串的最少插入次数 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 Problem: 力扣921. 使括号有效的最少添加 类似于上述题目,不过此时一个左括号要和两个右括号配对 1.同理上述题目,遍历字符串时若遇见一个左括…

探索小众爱好:打造个人韧性与特色之路

在这个信息爆炸的时代,我们很容易陷入“千篇一律”的漩涡中,无论是生活方式还是兴趣爱好,似乎都趋向于某种“流行”或“热门”。然而,真正的个性与魅力,往往来源于那些不为大众所知的小众爱好。今天,我想和…

电脑硬盘数据恢复,4个方法,轻松恢复数据

在数字化时代的浪潮中,电脑硬盘不仅是存储数据的仓库,更是我们生活、工作、学习的记忆宫殿。然而,当这个宫殿中的一部分珍贵记忆突然消失,仿佛历史的片段被无情地抹去,我们不禁会感到焦虑和恐慌。此时,电脑…

环球赛乐科技有限公司与北京城市学院共建实习“绿色通道”

环球赛乐(北京)科技有限公司(简称“赛氪网”)与北京城市学院近日宣布,双方将合作开通顶岗实习“绿色通道”,旨在为实习生提供高质量的实践机会和就业平台。此次合作不仅体现了校企合作的深度融合&#xff0…

【数据结构】带头双向循环链表的实现及链表顺序表的区别

目录 一、带头双向循环链表接口实现 连接关系: 创建哨兵位(表头): 头插——头删: 尾插——尾删: 查找——打印: 指定位置pos前插入,删除pos位置: 链表销毁&#x…

39 - 电影评分(高频 SQL 50 题基础版)

39 - 电影评分 (selectu.name as results fromMovieRating m left join Users u on m.user_idu.user_id GROUP BYm.user_id order by count(*) desc,u.name asc limit 1) union all (selectm1.title as results fromMovieRating m left join Movies m1 on m.movie_idm1.movie…

SQL实现UUIDv7

当我们选择数据库的主键类型时,通常会考虑自增数字或者 UUID。但是这两种类型都有优缺点,自增字段简单有序,性能良好,最大的问题是无法保证全局唯一性,分布式场景受限;UUID 具有全局唯一性,适合…

fastadmin框架修改前端时间戳格式的时区

一、上传文件 将 moment-timezone-with-data.js 和 moment-timezone-with-data.min.js 文件上传到项目的 \public\assets\libs\moment\ 文件夹中。 二、配置中引入文件 在 \public\assets\js\require-backend.js 文件中增加所引入文件的配置: moment-timezone-with-data: …

ITSG、COST-G、Tongji和WHU Level-2数据产品读取绘图(Matlab)

数据介绍: ICGEM International Center for Global Gravity Field Models (gfz-potsdam.de) ITSG 2018:Institute of Geodesy at Graz University of Technolog(格拉茨理工大学大地测量研究所) 2018版本,最高60阶球谐…

深度之眼(二十六)——神经网络基础知识(一)

文章目录 一、前言二、神经网络与多层感知机2.1 人工神经元2.2 人工神经网络2.3 多层感知机2.4 激活函数 一、前言 看了下课程安排,自己还是没安排好,刚刚捋清了一下思路。 基础:python、数理 认识:神经网络基础、opencv基础、py…

加速科技Flash存储测试解决方案 全面保障数据存储可靠性

Flash存储芯片 现代电子设备的核心数据存储守护者 Flash存储芯片是一种关键的非易失性存储器,作为现代电子设备中不可或缺的核心组件,承载着数据的存取重任。这种小巧而强大的芯片,以其低功耗、可靠性、高速的读写能力和巨大的存储容量&…

C Tips: 举例说明在 Visual C++ 中忽略 C4996 编译警告的几种方法

C4996 编译警告非常常见,经常发生在程序调用了类似于strcpy这样的不够安全的函数时。例如以下代码在 Visual C 的默认工程设置中会引起 C4996 编译警告: void foo() {char filename[MAX_PATH];strcpy(filename, "D:\\Pub\\Test\\1.dat"); }编…

Springboot小型仪器公司生产管理系统-计算机毕业设计源码031853

摘 要 本论文主要论述了如何使用java语言开发一个Springboot小型仪器公司生产管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述小型仪器公司生产管理系统…

数据结构——带头双向循环链表(c语言实现)

目录 1.单链表和双向链表对比 2.双向链表实现 2.1 创建新节点 2.2 链表初始化 2.3 尾插 2.4 头插 2.5 尾删 2.6 头删 2.7 查找 2.8 指定位置后插入数据 2.9 删除指定节点 2.10 销毁链表 2.11 打印链表 前言: 我们在前几期详细地讲解了不带头单…

【C#】找不到属性集方法。get只读属性用了反射设置setValue肯定报错

欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 背景 找不到属性集方法。get只读属性用了反射设置setValue肯定报错 报错…

OpenCv形态学(一)

目录 形态学转换 结构元素 腐蚀 膨胀 开运算 闭运算 形态学梯度 顶帽 黑帽 图像轮廓 查找轮廓 绘制轮廓 形态学转换 形态变换是一些基于图像形状的简单操作。通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性…

推荐系统(LLM去偏?) | (WSDM24)预训练推荐系统:因果去偏视角

::: 大家好!今天我分享的文章是来自威斯康星大学麦迪逊分校和亚马逊AWS AI实验室的最新工作,文章所属领域是推荐系统和因果推理,作者针对跨域推荐中的偏差问题提出了一种基于因果去偏的预训练推荐系统框架PreRec。 ::: 原文:Pre-t…

2024年敏捷开发管理工具10大精选

国内外主流的十大敏捷开发管理系统:PingCode、Tapd、OpenProject、Jira、ClickUp、Monday.com、Wrike、Taiga、Tuleap、Redmine。 敏捷开发已成为软件开发领域的一种标准实践,有效的管理工具是其成功实施的关键。本文将探讨在2024年,哪些敏捷…