检测Python程序的执行效率
无意中被问到代码执行效率的问题,那就总结一下检测代码执行效率的几种方式:
一、装饰器
在函数上加装饰器,来得到函数的执行时间。
def cst_time(func, *args, **kwargs):
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
timestrap = end -start
print('function %s running time is %s'%(func.__name__,timestrap))
return ret
return wrapper
二、timeit模块
用timeit模块来计算代码执行时间:
python3 -m timeit -n 4 -r 5 -s "import binaryTree" "binaryTree" #其中binaryTree表示python脚本文件名 或 python3 -m timeit -n 4 -r 5 -s "import binaryTree" "binaryTree.functionname" #可以指定脚本中某个具体的函数
参数:
-m mod : run library module as a script (terminates option list)
执行结果:
4 loops, best of 5: 0.0792 usec per loop
这表示测试了4次,平均每次测试重复5次,最好的测试结果是0.0792秒。
如果不指定测试或重复次数,默认值为10次测试,每次重复5次。
三、Linux的time命令
time -p python3 multiTree.py
执行结果:
real 0.09 # 执行脚本的总时间
user 0.04 # 执行脚本消耗的CPU时间
sys 0.00 # 执行内核函数消耗的时间 # real - (user + sys)的时间差,就是消耗在I/O等待和执行其他任务消耗的时间。
四、cProfile模块
如果想知道每个函数消耗的多少时间,以及每个函数执行了多少次,可以用CProfile模块。
python3 -m cProfile -s cumulative multiTree.py
执行结果:
五、line_Profiler模块
使用line_Profiler可以给出执行每行代码所占用的CPU时间。
$ sudo pip3 install line_Profiler
用@profile 指定去检测那个函数,不需要导入模块。
@profile
def random_sort2(n):
l = [random.random() for i in range(n)]
l.sort()
return l if __name__ == "__main__":
random_sort2(2000000)
可以通过如下命令逐行扫描每行代码的执行情况:
$ kernprof -l -v timing_functions.py
其中-l表示逐行解释,-v表示表示输出详细结果。通过这种方法,我们看到构建数组消耗了44%的计算时间,而sort()方法消耗了剩余的56%的时间。
六、memory_profiler模块
逐行检测每行代码内存的使用的情况。但使用这个模块会让代码运行更慢。
$ sudo pip3 install memory_profiler
安装 psutil模块,会让memory_profiler运行更快。
$ sudo pip3 install psutil
在函数上加 @profile 装饰器来指定需要追踪的函数。
执行如下命令,查看结果:
$ python3 -m memory_profiler timing_functions.py
七、guppy模块
通过这个包可以知道在代码执行的每个阶段中,每种类型(str、tuple、dict等)分别创建了多少对象。
$ pip3 install guppy
将其添加到代码中:
from guppy import hpy def random_sort3(n):
hp = hpy()
print( "Heap at the beginning of the functionn", hp.heap())
l = [random.random() for i in range(n)]
l.sort()
print( "Heap at the end of the functionn", hp.heap())
return l if __name__ == "__main__":
random_sort3(2000000)
执行命令:
$ python3 timing_functions.py
查看结果:
-----------------------------------------------------------------------------------------------------------------------------------------------------
检测Python程序的执行效率的更多相关文章
- Python程序的执行过程原理(解释型语言和编译型语言)
Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的. ...
- Python程序的执行过程 解释型语言和编译型语言
转载地址:http://blog.csdn.net/lujiandong1/article/details/50067655 1. Python是一门解释型语言? 我初学Python时,听到的关于Py ...
- 说说Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
- 多余的Using Namespaces或引用会影响程序的执行效率么?
在.NET程序编写中,需要using相应命名空间或添加相应的References,可有时候没有使用到的命名空间也被添加到了Using Namespaces中,那么,这样会影响程序的执行效率么? 通过示 ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- Python程序的执行原理(转载)
Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...
- 多余的Using Namespaces或引用会影响程序的执行效率么?(转)
转自:http://www.cnblogs.com/Interkey/p/UsingNameSpace.html 多余的Using Namespaces或引用会影响程序的执行效率么? 在.NET程序编 ...
- Python程序的执行原理
1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 2. 字节码 字节码在Python虚拟机程序里对应的是PyCo ...
随机推荐
- LRIP UVALive - 7148 (点分治)
大意: 给定树, 每个点有点权, 求最长非减树链, 满足树链上最大值与最小值之差不超过D 点分治, 线段树维护最小值为$x$时的最长非增和非减树链即可. 实现时有技巧是翻转一下儿子区间, 这样可以只维 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- Presto改造
最近在打造一款可视化分析产品, 需要用到组合多数据源, 进行查询, 看了挺多开源的插件, 发现目前只有Presto比较符合, 但是由于Presto没有多用户机制和资源管理, 所以需要在这基本上构建多用 ...
- python语言的优缺点
python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然之路. 龟叔给Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Py ...
- JS类型转换之valueOf和toString详解
最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2)// 3 add(1,2,3)(10)// 16 add(1)(2)(3)(4)(5)// 15 对于一个好 ...
- PLSQL 触发器
触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行 GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...
- 创芯Xilinx Microblaze 学习系列第一集
创芯Xilinx Microblaze 学习系列第一集 Xilinx ISE Design Suite 13.2 The MicroBlaze™ embedded processor soft cor ...
- css中用#id.class的形式定义样式,为什么这样用,不直接写成.class.代码如下:#skin_0.selected{}这种的
<ul class="skin"> <li id="skin_0" title="蓝色" class="sele ...
- L202
Yuan Cao’s teenage years were hardly typical. By age 18, he had already graduated from high school, ...
- myeclipse单步调试
如何进行myclipse的单步调式与跟踪?希望大虾们详细点,多谢. 打断点,然后运行,进debug试图,按F6执行一行,按F5是钻进去执行 追问 朋友,能详细点吗? 本人是初学 回答 如图 如若成功请 ...