首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python - 性能分析 profile 使用方法

Python - 性能分析 profile 使用方法

作者头像
为为为什么
发布2022-08-04 15:13:41
发布2022-08-04 15:13:41
2.6K0
举报
文章被收录于专栏:又见苍岚又见苍岚

代码性能至关重要,但有时难以弄清性能瓶颈的位置,python的profile包可以解决这个问题并指导提升代码性能。

简介

代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 profile, cProfilehotshot 等。其中 Profiler 是 python 自带的一组程序,能够描述程序运行时候的性能,并提供各种统计帮助用户定位程序的性能瓶颈。Python 标准模块提供三种 profilers:cProfile, profile 以及 hotshot

pycharm 专业版带有 profile 工具,vs code 等其他 ide 的 python 用户就需要自己调用profile了。

性能分析方法

  1. 引入python自带的profilecProfile
代码语言:javascript
复制
import cProfile
# or
import profile

  1. 确定需要分析性能的函数
代码语言:javascript
复制
def sub_fun():
    sum = 0
    for i in range(20):
        sum += i
    return sum


def fun():
    sum = 0
    for i in range(100):
        sum += sub_fun()
    return sum

我们分析函数 fun 的性能

  1. 性能分析
python 脚本中分析
代码语言:javascript
复制
cProfile.run('fun()')
# or
profile.run('fun()')

  • 输出
代码语言:javascript
复制
  104 function calls in 0.000 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    0.000    0.000 <string>:1(<module>)
   100    0.000    0.000    0.000    0.000 test.py:23(sub_fun)
     1    0.000    0.000    0.000    0.000 test.py:30(fun)
     1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
     1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

  • 其中输出每列的具体解释如下:

参数名称

参数信息

ncalls

表示函数调用的次数

tottime

表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间

percall

(第一个 percall)等于 tottime/ncalls

cumtime

表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间

percall

(第二个 percall)即函数运行一次的平均时间,等于 cumtime/ncalls

filename:lineno(function)

每个函数调用的具体信息

  • 保存日志

如果需要将输出以日志的形式保存,只需要在调用的时候加入另外一个参数。 可以在当前文件夹存下日志信息到prof文件中。

代码语言:javascript
复制
profile.run(“fun()”, filename=”result.prof”)

命令行分析

如果不想在程序中调用profile库使用,可以在命令行使用命令。

  • 运行命令查看性能分析结果
代码语言:javascript
复制
python -m cProfile test.py

  • 将性能分析结果保存到result文件
代码语言:javascript
复制
python -m cProfile -o result.prof test.py

读取prof文件中的分析日志
  • 可以用 pstats 读取prof文件中的日志
代码语言:javascript
复制
import pstats
p=pstats.Stats('result.prof')
p.sort_stats('time').print_stats()

  1. 可视化

比较推荐的是使用 snakeviz可视化代码运行时间 官网:https://jiffyclub.github.io/snakeviz/

  • 安装 snakeviz
代码语言:javascript
复制
pip install snakeviz

运行Python代码的同时用cProfile保存运行时间数据

注意:要用cProfile,使用 profile 会导致 snakeviz 无法读取日志 相关错误信息:

代码语言:javascript
复制
Traceback (most recent call last):
  File ".../site-packages/tornado/web.py", line 1413, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File ".../site-packages/snakeviz/main.py", line 30, in get
    table_rows=table_rows(s), callees=json_stats(s))
  File ".../site-packages/snakeviz/stats.py", line 65, in json_stats
    (keyfmt(*ck), list(cv)) for ck, cv in stats.stats[k][-1].items())
  File ".../site-packages/snakeviz/stats.py", line 65, in <genexpr>
    (keyfmt(*ck), list(cv)) for ck, cv in stats.stats[k][-1].items())
TypeError: 'int' object is not iterable
代码语言:javascript
复制
snakeviz result.prof

  • 在浏览器中可以看到函数时间消耗信息:

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年6月4日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 性能分析方法
    • python 脚本中分析
    • 命令行分析
    • 读取prof文件中的分析日志
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档