Python之代码性能分析工具时间内存

31次阅读

共计 1281 个字符,预计需要花费 4 分钟才能阅读完成。

0 背景
在运行复杂的 Python 程序时,执行时间会很长,这时也许想提高程序的执行效率。但该怎么做呢?首先,要有个工具能够检测代码中的瓶颈,例如,找到哪一部分执行时间比较长。接着,就针对这一部分进行优化。同时,还需要控制内存和 CPU 的使用,这样可以在另一方面优化代码。本文主要介绍两种最常用的监控工具。

  1. 时间分析

line_profiler 模块可以给出执行每行代码所需占用的 CPU 时间,首先,安装该模块:

$ pip install line_profiler
使用方法是导入相关模块,并定义一个装饰器,如下所示

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 语句,不太方便,因此建议使用这里推荐的装饰器的方法。

  1. 内存分析

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)。更多写作与参考学习材料等可登录 ZG 文库网 http://www.zgwenku.com/

正文完
 0