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

0 背景

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

1. 时间分析

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

pip install line_profiler

如果pip安装不上,则需要下载源码安装 

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

2. 内存分析

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)。

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗而研之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值