[英]How to calculate the average result of several cProfile results?
Instead of only running the profile one time like this: 而不是只像这样一次运行配置文件:
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')
Where the profile results are like this: 概要文件结果如下:
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}
I would like to run several times and print the average results, for better precision. 我想运行几次并打印平均结果,以获得更好的精度。
This is a initial script recipe I thought of: 这是我想到的初始脚本配方:
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')
After running this, it should display the results like its first version did, but the difference is that they are the average of several runs, instead of running it one time. 运行此命令后,它应像第一个版本一样显示结果,但区别在于它们是几次运行的平均值,而不是一次运行。
The draft script still missing the part profile_results /= count
where after all the iterations, I would get all the computed results and create the average results and display it on the screen always: 草稿脚本仍然缺少
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}
I managed to create the following code, with the function average()
. 我设法用函数
average()
创建了以下代码。 I opened the implementation of pstats
and observed there is a function called Stats.add()
which seems to just concatenate results into the current object: https://docs.python.org/3.7/library/profile.html#pstats.Stats.add 我打开了
pstats
的实现,观察到有一个名为Stats.add()
的函数,它似乎只是将结果连接到当前对象中: https : 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 )
Results: 结果:
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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.