Python脚本性能剖析

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

#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

时间: 2024-11-05 16:21:14

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

Python脚本性能分析

来自:http://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html def foo(): sum = 0 for i in range(10000): sum += i sumA = bar() sumB = bar() return sum def bar(): sum = 0 for i in range(100000): sum += i return sum if __name__ == "__main__"

一个简单的监控redis性能的python脚本

一个简单的监控redis性能的python脚本 上一篇已经讲了如何监控memcached了,现在也顺带讲如何监控redis. 首先介绍下监控redis那些信息: Redis ping:检验ping Redis alive:查看检查端口是否alive Redis connections:查看连接数 Redis blockedClients:正在等待阻塞客户端数量 Redis connectionsUsage:redis的连接使用率 Redis memoryUsage:redis内存使用量 Redi

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

选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率.如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下

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

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(

Python脚本分析CPU使用情况

在这篇文章中,我将讨论一个工具,用以分析Python中CPU使用情况.CPU分析是通过分析CPU执行代码的方式来测量代码的性能,以此找到代码中的不妥之处,然后处理它们. 接下来我们将看看如何跟踪Python脚本使用时CPU使用情况,重点关注以下几个方面: 1.cProfile 2.line_profiler 3.pprofile 4.vprof 测量CPU使用率 对于这篇文章,我将主要使用与内存分析中使用脚本相同的脚本,具体如下: 另外,请记住,在PyPy2中,您需要使用与之配合的pip版本:

python源码剖析笔记1——Python对象初见

python源码剖析笔记1--Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神.很多东西不用就忘记了,比如C语言,正好,python源码用C写的,分析python源码的同时又能温故C语言基础,实在是件很好的事情.另外,还有陈儒大神的<python源码剖析>做指引,分析也不至于没头没脑.期望在一个月的业余时间,能有所小成,以此为记. 1 python中的对象 python中,一切东西都是对象,在c语言实现

Python源码剖析笔记6-函数机制

Python的函数机制是很重要的部分,很多时候用python写脚本,就是几个函数简单解决问题,不需要像java那样必须弄个class什么的. 本文简书地址:http://www.jianshu.com/p/d00108741a18 1 函数对象PyFunctionObject PyFunctionObject对象的定义如下: typedef struct { PyObject_HEAD PyObject *func_code; /* A code object */ PyObject *func

Python源码剖析笔记5-模块机制

本文简书地址: http://www.jianshu.com/p/14586ec50ab6 python中经常用到模块,比如import xxx,from xxx import yyy这样子,里面的机制也是需要好好探究一下的,这次主要从黑盒角度来探测模块机制,源码分析点到为止,详尽的源码分析见陈儒大神的<python源码剖析>第14章. 1 如何导入模块 首先来看一个导入模块的例子.创建一个文件夹demo5,文件夹中有如下几个文件. [email protected] ~/demo5 $ ls

Python源码剖析笔记4-内建数据类型

Python源码剖析笔记4-内建数据类型 Python内建数据类型包括整数对象PyIntObject,字符串对象PyStringObject,列表对象PyListObject以及字典对象PyDictObject等.整数对象之前已经分析过了,这一篇文章准备分析下余下几个对象,这次在<python源码剖析>中已经写的很详细的部分就不赘述了,主要是总结一些之前看书时疑惑的地方. 1 整数对象-PyIntObject 参见 python整数对象. 2 字符串对象-PyStringObject 2.1