Back to Blogs
python
performance
profiling
time
memory

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

Soloman
2021-05-06

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

1 时间分析

line_profiler模块可以给出执行每行代码所需占用的CPU时间

# 直接安装
pip install line_profiler

# 下载源码安装
git clone https://github.com/rkern/line_profiler.git

最佳使用方法是导入相关模块,并定义一个装饰器,在需要分析的函数上使用装饰器即可:

def func_time_profiler(f):
    """
    时间分析
    """
    from functools import wraps
    from line_profiler import LineProfiler

    @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


import random 
@func_time_profiler
def random_sort(n):
    rand_list = [random.random() for i in range(n)]
    rand_list.sort()
    return rand_list


if __name__ == "__main__":
    random_sort(2000000)

运行结果说明:

  • Total Time:测试代码的总运行时间
  • Line:代码行号
  • Hits:表示每行代码运行的次数,如循环遍历
  • Time:每行代码运行的总时间
  • Per Hits:每行代码运行一次的时间
  • % Time:每行代码运行时间的百分比
  • Line Contents:对应的代码行

2 内存分析

memory_profiler模块用来逐行测量代码的内存使用

pip install memory_profiler psutil

memory_profiler 需要使用 @profile 装饰器来标识需要追踪的函数,不分析时需要注释掉 @profile 装饰器

# test.py
import random 


@profile
def random_sort(n):
    rand_list = [random.random() for i in range(n)]
    rand_list.sort()
    return rand_list


if __name__ == "__main__":
    random_sort(2000000)

运行上面的测试函数:

python -m memory_profiler test.py

运行结果说明:

  • Line:代码行号
  • Mem usage:总的内存占用情况
  • Increment:每次执行该行代码后新增的内存占用
  • Line Contents:对应的代码行

其它使用方式,不分析时需要注释掉 @profile 装饰器

# test.py
import random 
from memory_profiler import profile


# precision: 精确到小数点后几位 
# stream: 此模块分析结果保存到 'memory_profiler.log' 日志文件。如果没有此参数,分析结果会在控制台输出
@profile(precision=4, stream=open('memory_profiler.log','w+'))
def random_sort(n):
    rand_list = [random.random() for i in range(n)]
    rand_list.sort()
    return rand_list


if __name__ == "__main__":
    random_sort(2000000)

运行上面的测试函数:

python test.py