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传递参数方式小结
Apr 17 Python
详解Python发送邮件实例
Jan 10 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
Django项目中model的数据处理以及页面交互方法
May 30 Python
python2 与 python3 实现共存的方法
Jul 12 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
短信提示使用 特效
2007/01/19 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
js获取域名的方法
2015/01/27 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Python使用Scrapy爬取妹子图
2015/05/28 Python
python实现Floyd算法
2018/01/03 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
分享一个python的aes加密代码
2020/12/22 Python
自荐书封面下载
2013/11/29 职场文书
高中历史教学反思
2014/02/08 职场文书
《散步》教学反思
2014/03/02 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
出生证明格式
2015/06/15 职场文书
人事任命书范本
2015/09/21 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书