首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算多个cProfile结果的平均结果?

如何计算多个cProfile结果的平均结果?
EN

Stack Overflow用户
提问于 2019-01-26 11:18:22
回答 1查看 741关注 0票数 1

而不是像这样只运行一次配置文件:

代码语言:javascript
复制
import cProfile

def do_heavy_lifting():
    for i in range(100):
        print('hello')

profiller = cProfile.Profile()
profiller.enable()

do_heavy_lifting()

profiller.disable()
profiller.print_stats(sort='time')

其中配置文件结果如下所示:

代码语言:javascript
复制
      502 function calls in 0.000 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100    0.000    0.000    0.000    0.000 {built-in method builtins.print}
   200    0.000    0.000    0.000    0.000 cp1252.py:18(encode)
   200    0.000    0.000    0.000    0.000 {built-in method _codecs.charmap_encode}
     1    0.000    0.000    0.000    0.000 test.py:2(do_heavy_lifting)
     1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

我想运行几次并打印平均结果,以获得更好的精度。

这是我想到的一个初始脚本配方:

代码语言:javascript
复制
import cProfile

def do_heavy_lifting():
    for i in range(100):
        print('hello')

def best_of_profillings(target_profile_function, count):
    profile_results = []

    for index in range(count):
        profiller = cProfile.Profile()
        profiller.enable()

        target_profile_function()

        profiller.disable()
        profile_results.append(profiller)

    profile_results /= count
    return profile_results

heavy_lifting_result = best_of_profillings(do_heavy_lifting, 10)
heavy_lifting_result.print_stats(sort='time')

运行后,它应该像第一个版本一样显示结果,但不同的是,它们是多次运行的平均值,而不是运行一次。

草稿脚本仍然缺少profile_results /= count部分,在所有迭代之后,我将获得所有计算结果,并创建平均结果并始终显示在屏幕上:

代码语言:javascript
复制
      502 function calls in 0.000 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100    0.000    0.000    0.000    0.000 {built-in method builtins.print}
   200    0.000    0.000    0.000    0.000 cp1252.py:18(encode)
   200    0.000    0.000    0.000    0.000 {built-in method _codecs.charmap_encode}
     1    0.000    0.000    0.000    0.000 test.py:2(do_heavy_lifting)
     1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-26 12:18:52

我设法使用函数average()创建了以下代码。我打开了pstats的实现,发现有一个名为Stats.add()的函数,它似乎只是将结果连接到当前对象中:https://docs.python.org/3.7/library/profile.html#pstats.Stats.add

代码语言:javascript
复制
import io
import pstats
import cProfile

def do_heavy_lifting():
    for i in range(100):
        print('hello')

def average(stats, count):
    stats.total_calls /= count
    stats.prim_calls /= count
    stats.total_tt /= count

    for func, source in stats.stats.items():
        cc, nc, tt, ct, callers = source
        stats.stats[func] = ( cc/count, nc/count, tt/count, ct/count, callers )

    return stats

def best_of_profillings(target_profile_function, count):
    output_stream = io.StringIO()
    profiller_status = pstats.Stats( stream=output_stream )

    for index in range(count):
        profiller = cProfile.Profile()
        profiller.enable()

        target_profile_function()

        profiller.disable()
        profiller_status.add( profiller )

        print( 'Profiled', '%.3f' % profiller_status.total_tt, 'seconds at', index,
                'for', target_profile_function.__name__, flush=True )

    average( profiller_status, count )
    profiller_status.sort_stats( "time" )
    profiller_status.print_stats()

    return "\nProfile results for %s\n%s" % ( 
           target_profile_function.__name__, output_stream.getvalue() )

heavy_lifting_result = best_of_profillings( do_heavy_lifting, 10 )
print( heavy_lifting_result )

结果:

代码语言:javascript
复制
Profile results for do_heavy_lifting
         102.0 function calls in 0.001 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    100.0    0.001    0.000    0.001    0.000 {built-in method builtins.print}
      1.0    0.000    0.000    0.001    0.001 D:\test.py:5(do_heavy_lifting)
      1.0    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54375392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档