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