[Python]程序性能分析
有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考A guide to analyzing Python performance,也可以说是翻译。
指标
- 运行时间
- 时间瓶颈
- 内存使用
- 是否有内存泄漏
基本
linux time
这是个shell中自带的命令,也是最简单和方面的方法,但是得到信息太少
[root@bogon util]# time python pvsts.py
Yesterday PV/UV
PV 46300
UV is 3899
real 2m36.591s #花费时间
user 2m37.167s #用户态时间
sys 0m2.010s #内核态时间
如果 sys+user 比 real 小的多,就要考虑io等待时间是否过长了。
使用Cprofile工具
用起来很简单,显示的东西也很多,但是对于代码来说不是很直观
[root@bogon util]# python -m cProfile pvsts.py
Yesterday PV/UV
PV 46300
UV is 3899
502249600 function calls (502249597 primitive calls) in 250.221 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 250.221 250.221 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 __future__.py:48(<module>)
1 0.000 0.000 0.000 0.000 __future__.py:74(_Feature)
7 0.000 0.000 0.000 0.000 __future__.py:75(__init__)
1 0.000 0.000 0.000 0.000 __init__.py:49(normalize_encoding)
1 0.000 0.000 0.000 0.000 __init__.py:71(search_function)
1 0.000 0.000 0.000 0.000 base64.py:3(<module>)
测试时间工具line_profiler
就是这个小工具,安装很simple
$ pip install line_profiler
在想要测试的函数上添加一个 @profile装饰器(不用倒入任何包,工具会自动倒入)
@profile
def sts_uv():
#mac_list = []
mac_set = set()
with open(temp_log, 'r') as f:
for line in f.readlines():
basid, mac, ip = decode_token(str(line.strip()))
#mac_list.append(mac)
mac_set.add(mac)
#uv = len(set(mac_list))
uv = len(mac_set)
print "UV is {0}".format(uv)
return uv
得到结果:
[root@bogon util]# kernprof -l -v pvsts.py
Yesterday PV/UV
PV 46300
UV is 3899
Wrote profile results to pvsts.py.lprof
Timer unit: 1e-06 s
Total time: 450.299 s
File: pvsts.py
Function: sts_uv at line 74
Line # Hits Time Per Hit % Time Line Contents
==============================================================
74 @profile
75 def sts_uv():
76 #mac_list = []
77 1 10 10.0 0.0 mac_set = set()
78 1 59 59.0 0.0 with open(temp_log, 'r') as f:
79 42431 38556 0.9 0.0 for line in f.readlines():
80 42430 450188794 10610.2 100.0 basid, mac, ip = decode_token(str(line.strip()))
81 #mac_list.append(mac)
82 42430 71491 1.7 0.0 mac_set.add(mac)
83 #uv = len(set(mac_list))
84 1 2 2.0 0.0 uv = len(mac_set)
85 1 15 15.0 0.0 print "UV is {0}".format(uv)
86 1 1 1.0 0.0 return uv
同时还是会生成一个pvsts.py.lprof文件
测试内存使用 pip install -U memory_profiler
安装两个工具
$ pip install -U memory_profiler
$ pip install psutil
使用上也是添加一个 ‘@profile’ 装饰器,跟上面的一样。
测试
[root@bogon util]# python -m memory_profiler pvsts.py
Yesterday PV/UV
PV 46300
UV is 3899
Filename: pvsts.py
Line # Mem usage Increment Line Contents
================================================
74 9.676 MiB 0.000 MiB @profile
75 def sts_uv():
76 #mac_list = []
77 9.676 MiB 0.000 MiB mac_set = set()
78 9.676 MiB 0.000 MiB with open(temp_log, 'r') as f:
79 15.289 MiB 5.613 MiB for line in f.readlines():
80 15.289 MiB 0.000 MiB basid, mac, ip = decode_token(str(line.strip()))
81 #mac_list.append(mac)
82 15.289 MiB 0.000 MiB mac_set.add(mac)
83 #uv = len(set(mac_list))
84 14.961 MiB -0.328 MiB uv = len(mac_set)
85 14.961 MiB 0.000 MiB print "UV is {0}".format(uv)
86 14.961 MiB 0.000 MiB return uv
声明:
本文出自 “orangleliu笔记本” 博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/45934005 作者orangleliu 采用署名-非商业性使用-相同方式共享协议
[Python]程序性能分析的更多相关文章
- Python程序性能分析模块----------cProfile
cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...
- python程序性能分析
中文:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html 英文:https://www.huyng.com/posts/pyth ...
- Linux下的应用程序性能分析 总结
Linux下的应用程序性能分析,根据内核程序和应用程序的不同,下文分两类进行描述. 我们侧重的是应用级别的程序,推荐google perf tool/kcachegrind组合 一.和内核有关的工具 ...
- Linux程序性能分析和火焰图
Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...
- 八、jdk工具之JvisualVM、JvisualVM之二--Java程序性能分析工具Java VisualVM
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- Golang程序性能分析
前言 程序性能分析我相信是每个程序员都会遇到的问题,比如说一个程序的CPU为什么占用这么高?有没有优化的空间?又比如程序出现了内存泄漏如何排查等等.如果是C++程序会借助于Google pprof c ...
- 一个python 服务器程序性能分析
该服务器为bono,启动11个进程. 1.设置cprofile 在启动服务的总入口设置cprofile if __name__=="__main__": import cProfi ...
- 转帖:Python应用性能分析指南
原文:A guide to analyzing Python performance While it’s not always the case that every Python program ...
- [golang]7种 Go 程序性能分析方法
视频信息 Seven ways to Profile Go Applicationsby Dave Cheneyat Golang UK Conf. 2016 视频:https://www.youtu ...
随机推荐
- ●BZOJ 4822 [Cqoi2017]老C的任务
题链: https://www.luogu.org/problemnew/show/P3755 (洛谷上数据范围给全了的) 题解: 树状数组,离线询问 (本来想弄一个二维树状数组/二维RMQ,然后直接 ...
- ●BZOJ 2560 串珠子
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2560 题解: 容斥,状压计数dp 首先求出一个数组 g[s] 表示集合内的点的连边方案数(两 ...
- 基于 Hexo + GitHub Pages 搭建个人博客(三)
一.添加扫描二维码关注功能 打开 themes 目录下的 next 主题配置文件,找到 Wechat Subscriber 标签,将该标签下的配置改成如下形式: # Wechat Subscriber ...
- # C语言程序设计第一次作业1234
---恢复内容开始--- C语言程序设计第一次作业 1.求圆面积和周长 输入圆的半径,计算圆的周长和面积 (1)流程图 (2)测试数据及运行结果 测试数据r=3 运行结果 2.判断闰年 输入一个四位年 ...
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- Springboot项目maven多模块拆分
多模块拆分的必要性 使用Java技术开发的工程项目,无论是数据处理系统还是Web网站,随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂这时候工程的进展就会遇到各种 ...
- spring cloud 入门系列二:使用Eureka 进行服务治理
服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cloud Netflix 微服务套件的一部分 ...
- Hive中yyyymmdd和yyyy-mm-dd日期之间的切换
以2017-12-05和20171205相互转换为例说明 方法1: from_unixtime+ unix_timestamp --20171205转成2017-12-05 ','yyyymmdd') ...
- Appium--swipe滑动方法
最近公司要求对APP模块自动化,以Android 自动化为例,把appium滑动的方法swipe()再小结下.滑动的目的,一方面是为了更好的查找元素,一方面就是为了滑屏操作.代码如下: package ...
- Webpack 4 Tutorial: from 0 Conf to Production Mode
webpack 4 is out! The popular module bundler gets a massive update. webpack 4, what's new? A massive ...