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函数参数*args**kwargs用法实例
Dec 04 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
python机器学习之贝叶斯分类
Mar 26 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
pygame实现打字游戏
Feb 19 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
python字典按照value排序方法
Dec 28 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
js实现移动端轮播图
2020/12/21 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python笔记之代理模式
2019/11/20 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
写好求职信第一句话的技巧
2013/10/26 职场文书
外语专业毕业生个人的自荐信
2013/11/19 职场文书
经典团队口号
2014/06/06 职场文书
课外小组活动总结
2014/08/27 职场文书
个人职业及收入证明
2014/10/13 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
教师节主题班会方案
2015/08/17 职场文书
导游词之青岛崂山
2019/12/27 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL