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之让人欢喜让人忧的迭代
Oct 02 Python
Python配置文件解析模块ConfigParser使用实例
Apr 13 Python
Python json模块dumps、loads操作示例
Sep 06 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
python爬取微信公众号文章的方法
Feb 26 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Django集成MongoDB实现过程解析
Dec 01 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 Python
python b站视频下载的五种版本
May 27 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常用函数小技巧
2008/09/11 PHP
UCenter Home二次开发指南
2009/05/28 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
关于跨站脚本攻击问题
2011/12/22 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
python实现单链表的方法示例
2019/09/03 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
python中spy++的使用超详细教程
2021/01/29 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
优秀大学生求职自荐信范文
2014/04/19 职场文书
学生上课说话检讨书
2014/10/25 职场文书
升学宴学生致辞
2015/07/27 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
MySQL主从切换的超详细步骤
2022/06/28 MySQL