Python性能分析工具Profile使用实例


Posted in Python onNovember 19, 2019

这篇文章主要介绍了Python性能分析工具Profile使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile,cProfile 与 hotshot 等。其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python 标准模块提供三种 profilers:cProfile,profile 以及 hotshot。

profile 的使用非常简单,只需要在使用之前进行 import 即可,也可以在命令行中使用。

使用Profile

测试示例:

import profile
def a():
  sum = 0
  for i in range(1, 10001):
    sum += i
  return sum

def b():
  sum = 0
  for i in range(1, 100):
    sum += a()
  return sum
if __name__ == "__main__":
  profile.run("b()")

输出结果:

<br data-filtered="filtered"> 104 function calls in 0.094 seconds
 
Ordered by: standard name
 
ncalls tottime percall cumtime percall filename:lineno(function)
   1  0.000  0.000  0.094  0.094 :0(exec)
   1  0.000  0.000  0.000  0.000 :0(setprofile)
   1  0.000  0.000  0.094  0.094 <string>:1(<module>)
   1  0.000  0.000  0.094  0.094 profile:0(b())
   0  0.000       0.000     profile:0(profiler)
  99  0.094  0.001  0.094  0.001 test.py:15(a)
   1  0.000  0.000  0.094  0.094 test.py:21(b)

其中输出每列的具体解释如下:

●ncalls:表示函数调用的次数;

●tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;

●percall:(第一个 percall)等于 tottime/ncalls;

●cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;

●percall:(第二个 percall)即函数运行一次的平均时间,等于 cumtime/ncalls;

●filename:lineno(function):每个函数调用的具体信息;

如果需要将输出以日志的形式保存,只需要在调用的时候加入另外一个参数。如 profile.run(“profileTest()”,”testprof”)。

命令行

如果我们不想在程序中调用profile库使用,可以在命令行使用命令。

import os

def a():
  sum = 0
  for i in range(1, 10001):
    sum += i
  return sum

def b():
  sum = 0
  for i in range(1, 100):
    sum += a()
  return sum

print b()

运行命令查看性能分析结果

python -m cProfile test.py

将性能分析结果保存到result文件

python -m cProfile -o result test.py

使用pstats来格式化显示结果

python -c "import pstats; p=pstats.Stats('reslut); p.print_stats()"

python -c "import pstats; p=pstats.Stats('result'); p.sort_stats('time').print_stats()

sort_stats支持以下参数:

calls, cumulative, file, line, module, name, nfl, pcalls, stdname, time

测试示例:在代码中直接使用profile与stats

import os
def a():
	sum = 0
for i in range(1, 10001):
	sum += i
return sum
def b():
	sum = 0
for i in range(1, 100):
	sum += a()
return sum
print b()
import cProfile# cProfile.run("b()")
cProfile.run("b()", "result")
import pstats
pstats.Stats('result').sort_stats(-1).print_stats()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现ip查询示例
Mar 26 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
python print 按逗号或空格分隔的方法
May 02 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
django的登录注册系统的示例代码
May 14 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
python traceback捕获并打印异常的方法
Aug 31 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
如何在python中写hive脚本
Nov 08 Python
Python实现自动装机功能案例分析
Oct 22 Python
理解深度学习之深度学习简介
Apr 14 Python
使用apiDoc实现python接口文档编写
Nov 19 #Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 #Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 #Python
python 上下文管理器及自定义原理解析
Nov 19 #Python
浅析python中while循环和for循环
Nov 19 #Python
django实现web接口 python3模拟Post请求方式
Nov 19 #Python
wxPython+Matplotlib绘制折线图表
Nov 19 #Python
You might like
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python群发邮件实例代码
2014/01/03 Python
Python进行数据提取的方法总结
2016/08/22 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
大班幼儿评语大全
2014/04/30 职场文书
2014年班级工作总结
2014/11/14 职场文书
先进集体申报材料
2014/12/25 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫