参考文件 https://www.cnblogs.com/meishandehaizi/p/5863234.html
https://blog.csdn.net/GuoQiZhang/article/details/105408009
1.逐行统计 line_profiler
1.1 安装line_profiler
https://www.lfd.uci.edu/~gohlke/pythonlibs
在这个网址找到对应得包,然后pip install 文件路径
1.2 方法1@profiler
在需要统计的函数,加上@profler装饰器,通过命令行 kernprof -l -v test_file.py 启动
@profile
def run(a=1):
print(a)
for i in range(10):
pass
if __name__ == '__main__':
run()
1.3 方法2 LineProfiler
该方法的好处是,可以不用删除@profiler, 将lp对象放在__name__=__main__下面, 只有主动执行文件时,才会显示
from line_profiler import LineProfiler
def run(a=1):
print(a)
for i in range(10):
pass
if __name__ == '__main__':
# 创建对象
lp = LineProfiler()
# 方式一:接受函数参数
lp.add_function(run)
# 方式二:
lp_wrap = lp(run)
lp_wrap(11) # 11传参给run函数
# 查看状态
lp.print_stats()
2.函数统计cprofile
2.1 执行脚本
# 直接把分析结果打印到控制台
python -m cProfile test.py
# 把分析结果保存到文件中
python -m cProfile -o result.out test.py
# 增加排序方式
python -m cProfile -o result.out -s cumulative test.py
2.2 执行代码文件
def func(a=1):
print(a)
for i in range(10):
pass
if __name__ == '__main__':
import cProfile
cProfile.run("func()") # 在控制台输出
cProfile.run("func()", filename='result.log') # 在文件输出
cProfile.run("func()", filename='result.log', sort='cumulative') # 排序输出
2.3 内容分析
名称 | 解释 |
---|---|
ncalls | 表示函数调用的次数 |
tottime | 表示指定函数的总的运行时间, 除掉函数中调用子函数的运行时间 |
percall | (第一个percall)等于tottime/ncalls |
cumtime | 表示该函数及其所有子函数的调用运行的时间, 即函数开始调用到返回的时间 |
percall | (第二个percall)即函数运行一次的平均时间, 等于cumtime/ncalls |
fiename:lineno(function) | 每个函数调用的具体信息,一般执行函数名 |
3 memory_profiler
3.1 安装
$ pip install memory_profiler
$ pip install psutil
3.2 方法一 装饰器
from memory_profiler import profile
# @profile() # 如果不传参,则会在控制台输出
@profile(precision=4, stream=open('memory_test.log', 'w+')) # precision:小数点精确位数, stream:输出文件保存位置
def run(a=1):
print(a)
for i in range(10):
pass
if __name__ == '__main__':
run()
3.3 方法二
@profile
def run(a=1):
print(a)
for i in range(10):
pass
if __name__ == '__main__':
run()