Python性能分析入门——cProfile、可视化、逐行分析、内存分析
文章目录
- 简介
- cProfile
- PyCharm
- 可视化
- 安装
- gprof2dot
- SnakeViz
- PyCallGraph
- 逐行分析
- 内存分析
- 内存堆分析
- 其他
- 遇到的坑
- 参考文献
简介
通过性能分析找到瓶颈,让我们在性能调优方面事半功倍
主要影响有:
- 内存占用
- 磁盘IO
- 网络IO
分析方法有:
- %timeit 魔法函数
- time.time()
- cProfile
- line_profiler
- heapy
- dowser
cProfile
朱利亚集合是一个在复平面上形成分形的点的集合,可以产生复杂图像,属于 CPU 密集型任务
改写 Python2 代码 julia1_nopil.py
test.py
import time# 复平面坐标常量
x1, x2, y1, y2 = -1.8, 1.8, -1.8, 1.8
c_real, c_imag = -0.62772, -.42193def calculate_z_serial_purepython(maxiter, zs, cs):"""使用朱利亚集合更新规则计算输出列表"""output = [0] * len(zs)for i in range(len(zs)):n = 0z = zs[i]c = cs[i]while abs(z) < 2 and n < maxiter:z = z * z + cn += 1output[i] = nreturn outputdef calc_pure_python(desired_width, max_iterations):"""创建复数z的坐标及其初始条件来构建朱利亚集合"""x_step = (float(x2 - x1) / float(desired_width))y_step = (float(y1 - y2) / float(desired_width))x = []y = []ycoord = y2while ycoord > y1:y.append(ycoord)ycoord += y_stepxcoord = x1while xcoord < x2:x.append(xcoord)xcoord += x_stepzs = [] # 复数z的坐标cs = [] # 复数初始条件for ycoord in y:for xcoord in x:zs.append(complex(xcoord, ycoord))cs.append(complex(c_real, c_imag))print('Length of x:', len(x))print('Total elements:', len(zs))start_time = time.time()output = calculate_z_serial_purepython(max_iterations, zs, cs)end_time = time.time()secs = end_time - start_timeprint(calculate_z_serial_purepython.__name__ + ' took', secs, 'seconds')if __name__ == '__main__':calc_pure_python(desired_width=1000, max_iterations=300)# Length of x: 1000# Total elements: 1000000# calculate_z_serial_purepython took 9.924650192260742 seconds
直接运行大约要 10 秒
使用 cProfile 进行性能分析
python -m cProfile -s cumulative test.py
效果
指标 | 含义 |
---|---|
ncalls | 调用次数 |
tottime | 函数耗时(不包括子函数) |
percall | tottime/ncalls |
cumtime | 函数耗时(包括子函数) |
percall | 平均时间 |
function | 函数描述 |
13 秒内调用了 36221989 次函数,直接运行大约 10 秒,使用 cProfile 多花了 3 秒
- __main__() 调用了 1 次,耗时 13.465 秒
- calc_pure_python() 调用了 1 次,耗时 0.514 秒
- calculate_z_serial_purepython() 调用了 1 次,耗时 8.663 秒
- abs() 调用了 34219980 次,耗时 4.137 秒
- list.append() 调用了 2002000 次,耗时 0.122 秒
PyCharm
Run → Profile
可视化
安装
下载 Graphviz ,添加环境变量
命令行运行验证
dot -version
gprof2dot
安装
pip install gprof2dot
使用 cProfile 生成统计文件
python -m cProfile -o test.profile test.py
用 SnakeViz 对 cProfile 进行可视化
gprof2dot -f pstats test.profile | dot -Tpng -o output.png
效果
SnakeViz
安装
pip install snakeviz
使用 cProfile 生成统计文件
python -m cProfile -o test.profile test.py
用 SnakeViz 对 cProfile 进行可视化
snakeviz test.profile
会自动打开网页
PyCallGraph
安装
pip install snakeviz
运行并输出图像 pycallgraph.png
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput()):code_to_profile()
不实用,运行时间太久,且信息不够详细
逐行分析
安装
pip install line_profiler
在 calculate_z_serial_purepython()
上一行加入 @profile
,忽略 IDE 的报错
运行
kernprof -l -v test.py
效果
指标 | 含义 |
---|---|
Line # | 行号 |
Hits | 执行次数 |
Time | 耗时 |
Per Hit | 平均耗时 |
% Time | 耗时占比 |
Line Contents | 具体代码 |
内存分析
安装
pip install memory_profiler
在 calculate_z_serial_purepython()
上一行加入 @profile
,忽略 IDE 的报错
运行
python -m memory_profiler test.py
运行很长时间
效果
内存堆分析
安装
pip install guppy3
改写代码
import timex1, x2, y1, y2 = -1.8, 1.8, -1.8, 1.8
c_real, c_imag = -0.62772, -.42193def calculate_z_serial_purepython(maxiter, zs, cs):output = [0] * len(zs)for i in range(len(zs)):n = 0z = zs[i]c = cs[i]while abs(z) < 2 and n < maxiter:z = z * z + cn += 1output[i] = nreturn outputdef calc_pure_python(desired_width, max_iterations):x_step = (float(x2 - x1) / float(desired_width))y_step = (float(y1 - y2) / float(desired_width))x = []y = []ycoord = y2while ycoord > y1:y.append(ycoord)ycoord += y_stepxcoord = x1while xcoord < x2:x.append(xcoord)xcoord += x_stepfrom guppy import hpyhp = hpy()h = hp.heap()print(h)print()zs = []cs = []for ycoord in y:for xcoord in x:zs.append(complex(xcoord, ycoord))cs.append(complex(c_real, c_imag))h = hp.heap()print(h)print()start_time = time.time()output = calculate_z_serial_purepython(max_iterations, zs, cs)end_time = time.time()secs = end_time - start_timeh = hp.heap()print(h)print()if __name__ == '__main__':calc_pure_python(desired_width=1000, max_iterations=300)
效果
其他
优化后的 julia1_nopil.py
遇到的坑
1. 报错 UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x8f in position 37: illegal multibyte sequence
去掉中文
参考文献
- Python Profilers 分析器 — Python 文档
- high_performance_python GitHub
- SnakeViz
- Profiling and visualization tools in Python
- Python Call Graph Documentation
- gprof2dot GitHub
- line_profiler GitHub
- guppy3 GitHub
- Python高性能编程
Python性能分析入门——cProfile、可视化、逐行分析、内存分析相关推荐
- 发布即巅峰:Java性能调优六大工具:MAT内存分析工具
MAT内存分析工具 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况.MAT是 基于Eclipse开发的一款免费的性 ...
- python对三国演义,水浒传,红楼梦人物关系与出场频率进行文本分析,数据可视化,词云分析
python对文本进行分析和数据可视化,主要运用到了jieba,worldcloudmatplotlib,nxwworkx,pandas库,其他库在代码中给出. 1.首先准备好这三本名著 2.准备好停 ...
- Java面向对象05:创建对象的内存分析成员变量和局部变量的内存分析
一.创建对象内存分析 代码 public class Pet {//宠物类//类的属性public String name;//宠物名public int age ; //宠物年龄public Str ...
- python爬虫从入门到放弃,含案例分析,超详细讲解(一)
Python爬虫 1.认识爬虫 1.1.概述 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者) 按照一定规律,自动地抓取万维网信息的程序或者脚本. 1.2.应用场景 ...
- envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...
- 易生信高级转录组分析和数据可视化-最后一天报名
常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,以后应该就如做个PCR一样常见.而且分析思路简洁清晰,是入门生信,学习生信分析思路的首选. 数据分析是相通的,通过一个简单 ...
- 易生信高级转录组分析和数据可视化第9期课程开课啦!!
常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,以后应该就如做个PCR一样常见.而且分析思路简洁清晰,是入门生信,学习生信分析思路的首选. 数据分析是相通的,通过一个简单 ...
- 有了这篇你还说你不会redis性能优化、内存分析及优化
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...
- Java性能调优工具:MAT内存分析工具,上万字带你彻底了解
MAT内存分析工具 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况.MAT是 基于Eclipse开发的一款免费的性 ...
最新文章
- 稳定性保障,如何慢慢放量灰度
- jenkins 忘记密码_持续集成工具Jenkins 在CentOS系统下安装
- DARPA可解释AI研究(XAI计划)的4年回顾与经验总结
- python求斐波那契数列第n个数及前n项和_使用python求斐波那契数列中第n个数的值示例代码...
- NKU两题简单题解析(递归分析与位运算技巧)
- american php frameworks
- VC按最小化、关闭按钮、Esc都隐藏主窗口
- react相关代码库以及框架的源码解析
- HDU5620 KK's Steel(C语言版)【废除!!!】
- Java网络编程之UDP
- C#的Bitmap.LockBits 使用说明
- php登录与注册的心得,与discuz实现同步登陆和注册
- E-prime脑电实验设计
- 图像识别与软件自动化测试
- UE4 骨骼重定向记录
- AD13转oRCAD原理图的操作方式
- 公开说说别人看不到_为什么我在QQ空间里面发表说说别人看不到?
- suse linux raid驱动,安装SuSE使用嵌入式SATA控制器用常见设备使用情况的megaSR swraid驱动程序...
- 图像的区域选取(matlib)
- vue01-前端知识体系(狂神)