###################

#Python脚本性能剖析

###################



cProfile/profile/hotshot用于统计Python脚本各部分运行频率和耗费时间等统计信息。pstats可用于格式化这些信息



cProfile,属C扩展。开销较小,适合剖析长时间执行的Python程序,推荐使用此模块

profile。纯Python模块,存在明显开销,但想对其扩展的话相对照较easy

hotshot,实验性的C模块。主要关注开销最小化,现已不再被维护将来可能从Python移除

profile和cProfile接口同样。cProfile相对较新可能在某些平台上不可用



以cProfile为例来说明Python脚本性能剖析方法

*以命令行方式使用:

$ python -m cProfile [-o output_file] [-s sort_order] myscript.py

比如:

$ python -m cProfile -o myscript.out myscript.py

之后使用pstats对结果进行格式化:

$ python -c "import pstats; p=pstats.Stats('myscript.out'); p.print_stats()"

能够在格式化时指定排序字段:

$ python -c "import pstats; p=pstats.Stats('myscript.out'); p.sort_stats('time').print_stats()"

*直接在脚本内部使用:

import cProfile

import re

cProfile.run('re.compile("foo|bar")', 'restats')

import pstats

p = pstats.Stats('restats')

#strip_dirs()移除模块名之前的路径信息,sort_stats(-1)按标准名(module/line/name)排序,print_stats打印统计信息

p.strip_dirs().sort_stats(-1).print_stats()

#按time排序并显示前10行

p.sort_stats('time').print_stats(10)

#按file排序仅仅显示class init方法相关的统计信息

p.sort_stats('file').print_stats('__init__')

#先按time排序再按cum排序,仅仅输出50%。然后仅列出包括init的部分

p.sort_stats('time', 'cum').print_stats(.5, 'init')

#若想知道谁调用了上述函数能够使用

p.print_callers(.5, 'init')



*cProfile模块说明

函数:

cProfile.run(command, filename=None, sort=-1)

cProfile.runctx(command, globals, locals, filename=None)¶

类:

cProfile.Profile(timer=None, timeunit=0.0, subcalls=True, builtins=True)

cProfile.Profile类下的方法:

enable()

Start collecting profiling data.



disable()

Stop collecting profiling data.



create_stats()

Stop collecting profiling data and record the results internally as the current profile.



print_stats(sort=-1)

Create a Stats object based on the current profile and print the results to stdout.



dump_stats(filename)

Write the results of the current profile to filename.



run(cmd)

Profile the cmd via exec().



runctx(cmd, globals, locals)

Profile the cmd via exec() with the specified global and local environment.



runcall(func, *args, **kwargs)

Profile func(*args, **kwargs)



*Stats类(pstats.Stats)说明

strip_dirs()    用以除去文件名称前的路径信息。

add(filename,[…]) 把profile的输出文件增加Stats实例中统计

dump_stats(filename) 把Stats的统计结果保存到文件

sort_stats(key,[…]) 最重要的一个函数,用以排序profile的输出

reverse_order() 把Stats实例里的数据反序重排

print_stats([restriction,…]) 把Stats报表输出到stdout

print_callers([restriction,…]) 输出调用了指定的函数的函数的相关信息

print_callees([restriction,…]) 输出指定的函数调用过的函数的相关信息

sort_stats支持下面參数:

參数
含义

'calls' call count

'cumulative' cumulative time

'cumtime' cumulative time

'file' file name

'filename' file name

'module' file name

'ncalls' call count

'pcalls' primitive call count

'line' line number

'name' function name

'nfl' name/file/line

'stdname' standard name

'time' internal time

'tottime' internal time

*一个比較典型的输出结果:

197 function calls (192 primitive calls) in 0.002 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)

     1    0.000    0.000    0.001    0.001 <string>:1(<module>)

     1    0.000    0.000    0.001    0.001 re.py:212(compile)

     1    0.000    0.000    0.001    0.001 re.py:268(_compile)

     1    0.000    0.000    0.000    0.000 sre_compile.py:172(_compile_charset)

     1    0.000    0.000    0.000    0.000 sre_compile.py:201(_optimize_charset)

     4    0.000    0.000    0.000    0.000 sre_compile.py:25(_identityfunction)

   3/1    0.000    0.000    0.000    0.000 sre_compile.py:33(_compile)

输出结果说明:

共同拥有197次函数调用,原始调用为192次,原始调用说明不包括递归调用。

以standard name进行排序。

3/1表示发生了递归调用,1为原始调用次数,3为递归调用次数

ncalls 函数的被调用次数

tottime 函数总计执行时间。除去函数中调用的函数执行时间

percall 函数执行一次的平均时间,等于tottime/ncalls

cumtime 函数总计执行时间。含调用的函数执行时间

percall 函数执行一次的平均时间。等于cumtime/ncalls

filename:lineno(function) 函数所在的文件名称,函数的行号。函数名





參考:

https://docs.python.org/2/library/profile.html

Python脚本性能剖析的更多相关文章

  1. Python脚本性能分析

    来自:http://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html def foo(): sum = 0 for i in ra ...

  2. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  3. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  4. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  5. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  6. 基于binlog来分析mysql的行记录修改情况(python脚本分析)

          最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...

  7. 如何在python脚本开发做code review

    在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...

  8. PyInstaller把Python脚本打包成可执行程序教程

    一.说明 一直以来都有把.py文件打包成.exe文件的想法,但总是不够强烈,每次拖着拖着就淡忘了. 昨天帮硬件部门的同事写了个脚本,然后今天下午的时候,他问有没有办法把脚本打包成可执行文件,这样方便以 ...

  9. MySQL 服务器性能剖析

    这是<高性能 MySQL(第三版)>第三章的读书笔记. 关于服务,常见的问题有: 如何确认服务器是否发挥了最大性能 找出执行慢的语句,为何执行慢 为何在用户端发生间歇性的停顿.卡死 通过性 ...

随机推荐

  1. vijos P1234口袋的天空(Kruskal)(最小生成树)

    P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵 ...

  2. 【推导】Codeforces Round #402 (Div. 2) A. Pupils Redistribution

    一次交换,会让Group A里面的某个数字的数量-1,另一个数字的数量+1:对Group B恰好相反. 于是答案就是xigma(i=1~5,numA[i]-numB[i]>0)(numA[i]- ...

  3. 【容斥原理】CDOJ - 1544 - 当咸鱼也要按照基本法

    众所周知zhu是一个大厨,zhu一直有自己独特的咸鱼制作技巧. tang是一个咸鱼供应商,他告诉zhu在他那里面有NN条咸鱼(标号从1到N)可以被用来制作. 每条咸鱼都有一个咸鱼值KiKi,初始时所有 ...

  4. Java高级架构师(一)第01节:整体课程概览

    本课程专注于构建:高可扩展性.高性能.大数据量.高并发.分布式的系统架构. 从零开始.全面系统.成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能. 适应人群: 1:有一定 ...

  5. Bean实例化(三种方法)

    (一)构造器实例化Bean 1. Bean1.java package com.inspur.ioc; public class Bean1 { } 2.Beans1.xml <?xml ver ...

  6. Maven设置snapshot无法在远程仓库下载的问题解决

    检查步骤如下: 1.检查nexus是否纳入public版本中: 2.配置中是否启用snapshots功能.以下方法两种设置都可以,任选一个即可. 一种是在项目pom.xml使用: <reposi ...

  7. Interaction triggers in WPF

    Interaction Class - static class that owns the Triggers and Behaviors attached properties. Handles p ...

  8. iOS: 格式化新浪微博/QQ说说等等的发布时间

    介绍:对于一些社交工具,我们可以发布一些说说或者心情什么的,如新浪微博,QQ,微信等,发布成功后,上面都会有一个发布的时间. 这个时间并不是具体的NSDate类型,而是经过格式化过的符合一般标准的模式 ...

  9. kernel简介

    内存管理 一般来看有三种类型的地址:物理地址.线性地址和逻辑地址,逻辑地址的精髓在于将地址分成两部分:段基地址+偏移,翻译的过程如下: 线性地址的精髓在于将所有的内存按照一定的大小分成了一页一页,对多 ...

  10. Qt 之 模仿 QQ登陆界面——样式篇

    一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...