热线电话:13121318867

登录
2019-01-26 阅读量: 730
如何计算几个cProfile结果的平均结果?

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

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')

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}

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

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在所有迭代之后的部分,我将获得所有计算结果并创建平均结果并始终在屏幕上显示:

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}

使用该函数创建以下代码average()。我打开了实现pstats并观察到有一个函数被调用Stats.add(),似乎只是将结果连接到当前对象

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 )

结果:

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}

0.0000
3
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子