Python代码性能(时间+内存)
本文转载自https://blog.csdn.net/zong596568821xp/article/details/102454288
背景
在运行复杂的Python程序时,执行时间会很长,这时也许想提高程序的执行效率。但该怎么做呢?首先,要有个工具能够检测代码中的瓶颈,例如,找到哪一部分执行时间比较长。接着,就针对这一部分进行优化。同时,还需要控制内存和CPU的使用,这样可以在另一方面优化代码。本文主要介绍两种最常用的监控工具。
时间分析
line_profiler模块可以给出执行每行代码所需占用的CPU时间,首先,安装该模块:
- pip安装
$ pip install line_profiler
or
- 源码安装
$ git clone https://github.com/rkern/line_profiler.git
$ find line_profiler -name '*.pyx' -exec cython {} ;
$ cd line_profiler
$ pip install . --user
- 示例
import random
from line_profiler import LineProfiler
from functools import wraps
#查询接口中每行代码执行的时间
def func_line_time(f):
@wraps(f)
def decorator(*args, **kwargs):
func_return = f(*args, **kwargs)
lp = LineProfiler()
lp_wrap = lp(f)
lp_wrap(*args, **kwargs)
lp.print_stats()
return func_return
return decorator
@func_line_time
# 定义一个测试函数
def random_sort2(n):
l = [random.random() for i in range(n)]
l.sort()
return l
if __name__ == "__main__":
random_sort2(2000000)
输出如下所示,各参数含义为
Total Time:测试代码的总运行时间
Line:代码行号
Hits:表示每行代码运行的次数
Time:每行代码运行的总时间
Per Hits:每行代码运行一次的时间
% Time:每行代码运行时间的百分比
网上大多数方法是下边:
1.在需要测试的函数前添加装饰器 @profile
2.启动程序 $kernprof -l -v test.py
这种方法无法正常运行原来的脚本,如果不用kernprof指令运行脚本时,还需注释掉@profile语句,不太方便,因此建议使用这里推荐的装饰器的方法。
内存分析
memory_profiler模块用来基于逐行测量代码的内存使用,安装方法如下:
$ pip install memory_profiler psutil
memory_profiler需要使用@profile装饰器来标识需要追踪的函数(即在函数前边加入@profile),就是上边一节后边提到的方法
# 前边内容省略
@profile
# 定义一个测试函数
def random_sort2(n):
l = [random.random() for i in range(n)]
l.sort()
return l
# 后边内容省略
运行
$ python -m memory_profiler test.py
结果
从结果可以看出,内存使用是以MiB为单位衡量的,表示的mebibyte(1MiB = 1.05MB)。