文章目录

  • 简介
  • 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

去掉中文

参考文献

  1. Python Profilers 分析器 — Python 文档
  2. high_performance_python GitHub
  3. SnakeViz
  4. Profiling and visualization tools in Python
  5. Python Call Graph Documentation
  6. gprof2dot GitHub
  7. line_profiler GitHub
  8. guppy3 GitHub
  9. Python高性能编程

Python性能分析入门——cProfile、可视化、逐行分析、内存分析相关推荐

  1. 发布即巅峰:Java性能调优六大工具:MAT内存分析工具

    MAT内存分析工具 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况.MAT是 基于Eclipse开发的一款免费的性 ...

  2. python对三国演义,水浒传,红楼梦人物关系与出场频率进行文本分析,数据可视化,词云分析

    python对文本进行分析和数据可视化,主要运用到了jieba,worldcloudmatplotlib,nxwworkx,pandas库,其他库在代码中给出. 1.首先准备好这三本名著 2.准备好停 ...

  3. Java面向对象05:创建对象的内存分析成员变量和局部变量的内存分析

    一.创建对象内存分析 代码 public class Pet {//宠物类//类的属性public String name;//宠物名public int age ; //宠物年龄public Str ...

  4. python爬虫从入门到放弃,含案例分析,超详细讲解(一)

    Python爬虫 1.认识爬虫 1.1.概述 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者) 按照一定规律,自动地抓取万维网信息的程序或者脚本. 1.2.应用场景 ...

  5. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

    1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...

  6. 易生信高级转录组分析和数据可视化-最后一天报名

    常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,以后应该就如做个PCR一样常见.而且分析思路简洁清晰,是入门生信,学习生信分析思路的首选. 数据分析是相通的,通过一个简单 ...

  7. 易生信高级转录组分析和数据可视化第9期课程开课啦!!

    常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,以后应该就如做个PCR一样常见.而且分析思路简洁清晰,是入门生信,学习生信分析思路的首选. 数据分析是相通的,通过一个简单 ...

  8. 有了这篇你还说你不会redis性能优化、内存分析及优化

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...

  9. Java性能调优工具:MAT内存分析工具,上万字带你彻底了解

    MAT内存分析工具 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况.MAT是 基于Eclipse开发的一款免费的性 ...

最新文章

  1. 稳定性保障,如何慢慢放量灰度
  2. jenkins 忘记密码_持续集成工具Jenkins 在CentOS系统下安装
  3. DARPA可解释AI研究(XAI计划)的4年回顾与经验总结
  4. python求斐波那契数列第n个数及前n项和_使用python求斐波那契数列中第n个数的值示例代码...
  5. NKU两题简单题解析(递归分析与位运算技巧)
  6. american php frameworks
  7. VC按最小化、关闭按钮、Esc都隐藏主窗口
  8. react相关代码库以及框架的源码解析
  9. HDU5620 KK's Steel(C语言版)【废除!!!】
  10. Java网络编程之UDP
  11. C#的Bitmap.LockBits 使用说明
  12. php登录与注册的心得,与discuz实现同步登陆和注册
  13. E-prime脑电实验设计
  14. 图像识别与软件自动化测试
  15. UE4 骨骼重定向记录
  16. AD13转oRCAD原理图的操作方式
  17. 公开说说别人看不到_为什么我在QQ空间里面发表说说别人看不到?
  18. suse linux raid驱动,安装SuSE使用嵌入式SATA控制器用常见设备使用情况的megaSR swraid驱动程序...
  19. 图像的区域选取(matlib)
  20. vue01-前端知识体系(狂神)

热门文章

  1. 计蒜客 - 蒜头君的任务
  2. iOS 阿里云上传图片
  3. Android WebRtc 桌面投屏、视频源码
  4. 下班路上捡了一部手机,我用8年开发知识主动找到了失主
  5. win10连不上网,显示电脑标识加一个红叉叉,网络连接只有以太网?
  6. iOS 获取手机IP 地址
  7. 在计算机语言中的乘法,LOGO语言编程题  高精度乘法★★
  8. IRQL深入解析(1)--IRQL级别
  9. 计算机考证报名时间表
  10. 张大哥笔记-如何利用网络赚钱(20种网络赚钱方法推荐)