10种检测Python程序运⾏时间、CPU和内存占⽤的⽅法在运⾏复杂的Python程序时,执⾏时间会很长,这时也许想提⾼程序的执⾏效率。但该怎么做呢?
⾸先,要有个⼯具能够检测代码中的瓶颈,例如,到哪⼀部分执⾏时间⽐较长。接着,就针对这⼀部分进⾏优化。
同时,还需要控制内存和CPU的使⽤,这样可以在另⼀⽅⾯优化代码。
因此,在这篇⽂章中我将介绍7个不同的Python⼯具,来检查代码中函数的执⾏时间以及内存和CPU的使⽤。
1. 使⽤装饰器来衡量函数执⾏时间
有⼀个简单⽅法,那就是定义⼀个装饰器来测量函数的执⾏时间,并输出结果:
import time
from functools import wraps
def fn_timer(function):
@wraps(function)
def function_timer(*args, **kwargs):
t0 = time.time()
result = function(*args, **kwargs)
t1 = time.time()
print ("Total time running %s: %s seconds" %
二年级编程课是学什么的(function.func_name, str(t1-t0))
)
return result
return function_timer
接着,将这个装饰器添加到需要测量的函数之前,如下所⽰:
@fn_timer
def myfunction(...):
...
例如,这⾥检测⼀个函数排序含有200万个随机数字的数组所需的时间:
@fn_timer
def random_sort(n):组词能不能组数字
return sorted([random.random() for i in range(n)])
if __name__ == "__main__":
random_sort(2000000)
执⾏脚本时,会看到下⾯的结果:
Total time running random_sort: 1.41124916077 seconds
2. 使⽤timeit模块
另⼀种⽅法是使⽤timeit模块,⽤来计算平均时间消耗。
执⾏下⾯的脚本可以运⾏该模块。
python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"
这⾥的timing_functions是Python脚本⽂件名称。
在输出的末尾,可以看到以下结果:
4 loops, best of 5: 2.08 sec per loop
这表⽰测试了4次,平均每次测试重复5次,最好的测试结果是2.08秒。
如果不指定测试或重复次数,默认值为10次测试,每次重复5次。
3. 使⽤Unix系统中的time命令
然⽽,装饰器和timeit都是基于Python的。在外部环境测试Python时,unix time实⽤⼯具就⾮常有⽤。
运⾏time实⽤⼯具:
$ time -p python timing_functions.py
输出结果为:
Total time running random_sort: 1.3931210041 seconds
real 1.49
user 1.40
sys 0.08
第⼀⾏来⾃预定义的装饰器,其他三⾏为:
real表⽰的是执⾏脚本的总时间
user表⽰的是执⾏脚本消耗的CPU时间。
kotlin语言也能用于app开发sys表⽰的是执⾏内核函数消耗的时间。
注意:根据,内核是⼀个计算机程序,⽤来管理软件的输⼊输出,并将其翻译成CPU和其他计算机中的电⼦设备能够执⾏的数据处理指令。
因此,Real执⾏时间和User+Sys执⾏时间的差就是消耗在输⼊/输出和系统执⾏其他任务时消耗的时间。
4. 使⽤cProfile模块
单元格左上方的小三角怎么加上如果想知道每个函数和⽅法消耗了多少时间,以及这些函数被调⽤了多少次,可以使⽤cProfile模块。
$ python -m cProfile -s cumulative timing_functions.py
现在可以看到代码中函数的详细描述,其中含有每个函数调⽤的次数,由于使⽤了-s选项(累加),最终结果会根据每个函数的累计执⾏时间排序。
python基础代码大全加翻译读者会发现执⾏脚本所需的总时间⽐以前要多。这是由于测量每个函数的执⾏时间这个操作本⾝也是需要时间。
5. 使⽤line_profiler模块
line_profiler模块可以给出执⾏每⾏代码所需占⽤的CPU时间。
⾸先,安装该模块:
$ pip install line_profiler
接着,需要指定⽤@profile检测哪个函数(不需要在代码中⽤import导⼊模块):
@profile
def random_sort2(n):
l = [random.random() for i in range(n)]
l.sort()
return l
if __name__ == "__main__":
random_sort2(2000000)
最好,可以通过下⾯的命令获得关于random_sort2函数的逐⾏描述。
$ kernprof -l -v timing_functions.py
其中-l表⽰逐⾏解释,-v表⽰表⽰输出详细结果。通过这种⽅法,我们看到构建数组消耗了44%的计算时间,⽽sort()⽅法消耗了剩余的56%的时间。
同样,由于需要检测执⾏时间,脚本的执⾏时间更长了。
6. 使⽤memory_profiler模块
memory_profiler模块⽤来基于逐⾏测量代码的内存使⽤。使⽤这个模块会让代码运⾏的更慢。
安装⽅法如下:
pip install memory_profiler
另外,建议安装psutil包,这样memory_profile会运⾏的快⼀点:
$ pip install psutil
与line_profiler相似,使⽤@profile装饰器来标识需要追踪的函数。接着,输⼊:
$ python -m memory_profiler timing_functions.py
脚本的执⾏时间⽐以前长1或2秒。如果没有安装psutil包,也许会更长。
从结果可以看出,内存使⽤是以MiB为单位衡量的,表⽰的mebibyte(1MiB = 1.05MB)。
7. 使⽤guppy包
最后,通过这个包可以知道在代码执⾏的每个阶段中,每种类型(str、tuple、dict等)分别创建了多少对象。安装⽅法如下:
$ pip 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)
运⾏代码:
$ python timing_functions.py
可以看到输出结果为:
通过在代码中将heap()放置在不同的位置,可以了解到脚本中的对象创建和删除操作的流程。
如果想学习更多关于Python代码速度优化⽅⾯的知识,我建议你去读这本书《.》
希望这篇⽂章能偶帮到你!^_^
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论