笔记-Python-性能分析-cProfile

笔记-Python-性能分析-cProfile

1.      简介

python官方提供了cProfile和profile对程序进行性能分析,建议使用cProfile;

cProfile:基于lsprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序,推荐使用这个模块; 
profile:纯Python实现的性能分析模块,接口和cProfile一致。但在分析程序时增加了很大的运行开销。不过,如果你想扩展profiler的功能,可以通过继承这个模块实现; 

引用于python3.6.5官方文档-标准库-27.4

2.      cProfile使用

2.1.    模块简介

profile.run(command,filename = None,sort = -1 )

该函数执行并从执行中收集分析统计数据。如果没有给出文件名,则该函数创建一个Stats 实例并打印一个简单的性能分析报告。如果指定了排序方式,此Stats实例以指定方式排序。

常用参数:

  # 直接把分析结果打印到控制台

    cProfile.run("test()")

    # 把分析结果保存到文件中

    cProfile.run("test()", filename="result.out")

    # 指定排序方式

cProfile.run("test()", filename="result.out", sort="cumulative")

import cProfile

import re

cProfile.run('re.compile("foo|bar")')

结果

  126 function calls in 0.000 seconds #126个调用,数字指原始调用,不包括递归;

   Ordered by: standard name #

       #调用数量,时间开销(不包括子函数),

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)

        1    0.000    0.000    0.000    0.000 <string>:1(<module>)

        4    0.000    0.000    0.000    0.000 enum.py:265(__call__)

        4    0.000    0.000    0.000    0.000 enum.py:515(__new__)

        2    0.000    0.000    0.000    0.000 enum.py:801(__and__)

        1    0.000    0.000    0.000    0.000 re.py:231(compile)

        1    0.000    0.000    0.000    0.000 re.py:286(_compile)

        1    0.000    0.000    0.000    0.000

       …仅罗列部分

class profile.Profile(timer = None,timeunit = 0.0,subcalls = True,builtins = True )

这个类通常只在需要比cProfile.run()函数提供更精确的分析控制时才使用。

使用案例:

import cProfile, pstats, io

pr = cProfile.Profile()

pr.enable()

# ... do something ...

pr.disable()

s = io.StringIO()

sortby = 'cumulative'

ps = pstats.Stats(pr, stream=s).sort_stats(sortby)

ps.print_stats()

print(s.getvalue())

函数释义:

enable()开始收集分析数据。

disable()停止收集分析数据。

create_stats()停止收集性能数据并创建stats对象。

print_stats(sort = -1 )创建一个Stats对象并将结果输出到stdout。

dump_stats(filename)将当前分析的结果写入文件(二进制格式)。

runcall(func, *args, **kwargs): 收集被调用函数func的性能分析数据Stats类
pstats模块提供的Stats类可以帮助我们读取和操作stats文件(二进制格式)

3.      关于Stats类

Stats类源自pstats模块,使用前import pstats

主要用于格式化展示cprofile的分析结果;

Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源。

strip_dirs(): 删除报告中所有函数文件名的路径信息

dump_stats(filename): 把stats中的分析数据写入文件(效果同cProfile.Profile.dump_stats())

sort_stats(*keys): 对报告列表进行排序,函数会依次按照传入的参数排序,关键词包括calls, cumtime等,具体参数参见官方文档;

reverse_order(): 逆反当前的排序

print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式, 例如(10, 1.0, ".*.py.*")表示打印所有py文件的信息的前10行结果。

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/9111337.html