无意中被问到代码执行效率的问题,那就总结一下检测代码执行效率的几种方式:

一、装饰器

在函数上加装饰器,来得到函数的执行时间。

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程序的执行效率的更多相关文章

  1. Python程序的执行过程原理(解释型语言和编译型语言)

    Python是一门解释型语言?我初学Python时,听到的关于Python的第一句话就是Python是一门解释型语言,我就这样一直相信下去,直到发现.pyc文件的存在,如果真是解释型语言,那么生成的. ...

  2. Python程序的执行过程 解释型语言和编译型语言

    转载地址:http://blog.csdn.net/lujiandong1/article/details/50067655 1. Python是一门解释型语言? 我初学Python时,听到的关于Py ...

  3. 说说Python程序的执行过程

    1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...

  4. Python程序的执行过程

    1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...

  5. 多余的Using Namespaces或引用会影响程序的执行效率么?

    在.NET程序编写中,需要using相应命名空间或添加相应的References,可有时候没有使用到的命名空间也被添加到了Using Namespaces中,那么,这样会影响程序的执行效率么? 通过示 ...

  6. 怎么优化JAVA程序的执行效率和性能?

    现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...

  7. Python程序的执行原理(转载)

    Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc  1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...

  8. 多余的Using Namespaces或引用会影响程序的执行效率么?(转)

    转自:http://www.cnblogs.com/Interkey/p/UsingNameSpace.html 多余的Using Namespaces或引用会影响程序的执行效率么? 在.NET程序编 ...

  9. Python程序的执行原理

    1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 2. 字节码 字节码在Python虚拟机程序里对应的是PyCo ...

随机推荐

  1. Eclipse 常用快捷键和使用技巧

    1.查看快捷键定义的地方 Window->Preferences->General->Keys. 2.更改启动页 在AndroidManifest.xml第一个activity标签项 ...

  2. c#在winform中用DataGridView实现分页效果

    public partial class Form11 : Form { public Form11() { InitializeComponent(); } private int Inum = 1 ...

  3. ASP.NET常用的指令

    指令的类型 指令 说明 Application 配置全局应用程序类 Assembly 注册用在Web窗体中的程序集.建议不使用此指令.而是NuGet. Control 配置用户控件 Implement ...

  4. OAF TABLE中第一列添加事件不生效

    我遇到一个比较诡异的现象 在TABLE中,我在TABLE的第一列添加了一个MessageCheckBox,并为其设置全局刷新的FireAction事件selection, 但是点击勾选框按钮之后,事件 ...

  5. 004——php字符串中处理函数(三)

    <?php /** * 字符串替换函数: * str_replace(); 替换字符串或数组元素,区分大小写,第四个参数可选,用于统计替换次数 * str_ireplace()不区分大小写替换 ...

  6. R语言rJava包安装载入及JAVA环境配置

    rJava 包的安装与载入 一般文本分词的教程都会贴出: install.packages("rJava") library(rJava) 来引导我们装载rJava包,运行inst ...

  7. Visual Studio 后期生成事件命令行

    set "str=$(ConfigurationName)" if "%str%"=="Release" (xcopy /y/e $(Tar ...

  8. Ubuntu 16.04系统开机紫屏的解决办法

    具体症状为卡在开机界面,按任何键都无反应. 网上查看了几篇文章 ,如下: 解决:ubuntu16.04启动时长时间停留在紫屏或跳文本的黑屏界面 Ubuntu16.04显卡驱动 电源管理 里面提到的开机 ...

  9. iOS语法糖 简单却不那么简单

    转载作者 香蕉大大 (Github) 开发过程中我特别喜欢用语法糖,原因很简单,懒得看到一堆长长的代码,但是语法糖我今天无意中看到更有意思的玩法.这里暂时吧把今天新学到的知识点整理一下希望大家喜欢,如 ...

  10. Android 开发有哪些新技术出现?

    这里记录一下在知乎回答的<Android 开发有哪些新技术出现?>.知乎链接在这里. 原问题如下: Android 开发有哪些新技术出现?可以从UI设计或者一些核心的算法之类的说起 这是我 ...