有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考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+userreal 小的多,就要考虑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]程序性能分析的更多相关文章

  1. Python程序性能分析模块----------cProfile

    cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...

  2. python程序性能分析

    中文:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html 英文:https://www.huyng.com/posts/pyth ...

  3. Linux下的应用程序性能分析 总结

    Linux下的应用程序性能分析,根据内核程序和应用程序的不同,下文分两类进行描述. 我们侧重的是应用级别的程序,推荐google perf tool/kcachegrind组合 一.和内核有关的工具 ...

  4. Linux程序性能分析和火焰图

    Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...

  5. 八、jdk工具之JvisualVM、JvisualVM之二--Java程序性能分析工具Java VisualVM

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  6. Golang程序性能分析

    前言 程序性能分析我相信是每个程序员都会遇到的问题,比如说一个程序的CPU为什么占用这么高?有没有优化的空间?又比如程序出现了内存泄漏如何排查等等.如果是C++程序会借助于Google pprof c ...

  7. 一个python 服务器程序性能分析

    该服务器为bono,启动11个进程. 1.设置cprofile 在启动服务的总入口设置cprofile if __name__=="__main__": import cProfi ...

  8. 转帖:Python应用性能分析指南

    原文:A guide to analyzing Python performance While it’s not always the case that every Python program ...

  9. [golang]7种 Go 程序性能分析方法

    视频信息 Seven ways to Profile Go Applicationsby Dave Cheneyat Golang UK Conf. 2016 视频:https://www.youtu ...

随机推荐

  1. [WC2008]游览计划

    [题目描述] 从未来过绍兴的小 D 有幸参加了Winter Camp 2008,他被这座历史名城的秀丽风景所吸引,强烈要求游览绍兴及其周边的所有景点. 主办者将绍兴划分为 N 行M 列(N×M)个方块 ...

  2. [BZOJ]3926 诸神眷顾的幻想乡(ZJOI2015)

    听说大佬们都会后缀自动机. 小C看完SAM,想找个裸题练习一下模板.听说这题还是陈老师出的?(羊毛出在羊身上) Description  幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生 ...

  3. PHP中利用DOM创建xml文档

    DOM创建xml文档 用dom创建如下文档: <booklist> <book id="1"> <title>天龙八部</title> ...

  4. python中常见错误及try-except 的用法

    1.常见的错误 我们在使用python过程中会出现: (1)SyntaxError 句法错误. (2)IndentationError 缩进错误. (3)NameError 变量未定义错误. (4)T ...

  5. 使用foreach需要判空。

    今天写代码的时候,需要遍历一个作为参数传递进来的容器, 当时顺手就加上了判空条件: if(null==list)return; 后来就像,不知道遍历(foreach)有没有帮我做这个工作: 下面看实验 ...

  6. Java finalize方法使用

    <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...

  7. # electron-vue 尝试做个网易云音乐

    当跑起来electron第一刻 我发现这个浏览器头是不是有点丑 是不是可以隐藏起来呢,答案当然是可以的 src/main/index.js mainWindow = new BrowserWindow ...

  8. 实践详细篇-Windows下使用VS2015编译安装Caffe环境(CPU ONLY)

    学习深度学习背景 最近在做一款抢票软件,由于12306经常检测账号状态,抢票抢着抢着就需要重新登录了,然后登录是需要验证码的.所以我最开始是想到了使用java基于感知哈希算法pHash做相似度匹配识别 ...

  9. jvm(四):垃圾回收

    垃圾回收我们主要从以下三个方面进行描述 垃圾对象的判断 目前判断对象为垃圾对象有两种方法:引用计数法,可达性分析法,目前普遍是的是可达性分析法 可达性分析法的实现原理: 定义gcroot一直往下找,如 ...

  10. Button 使用Command 按钮置灰未更新

    当Button绑定了Command,按钮在窗口弹出.或者其它事件时,会自动置灰. 有时,异步执行时间较长时,界面一些绑定了命令的Button,State不会变化,会一直置灰. 直到再次转移Focus. ...