如何准确测量返回python 3.7中的值的函数的cpu时间?

时间:2019-05-11 11:14:22

标签: python timer cpu benchmarking timeit

我正在尝试测量一个小功能的cpu时间,通常需要大约1500微秒。有时我会得出不正确或宽泛的置信区间。我想找到最佳准确的方法来对python 3.7中的函数进行基准测试。我想测量函数时间+获取其他计算的返回值。

我从timeit尝试了defualt_timer,请参见下面的代码。

from timeit import default_timer as timer
times=[] # store the times for 100 runs,then get min,max,averages etc

for i in range (100):
    t1= timer()
    x,y,z = apply_message(s,text)
    t2= timer()
    execution_time= (t2-t1) * 1000000 # convert it to microsecond
    times+=[execution_time]

我有时发现最小值1300和最大值75000,相差很大。在其他情况下,它们很接近。我想至少看到的结果使我的95置信区间小于平均值的10%。

1 个答案:

答案 0 :(得分:0)

如果(例如)在执行过程中将进程迁移到另一个CPU,通常会出现异常。 (因此所有内存访问都会在高速缓存中丢失一段时间,因为前一个内核的L1d和L2处于高温状态)。这也可能发生在现实生活中。

因此,您必须确定要测量的内容:“正常”的“无怪异”情况,或包括最坏情况的完整分发。

如果您保留离群值,那肯定不是高斯正态分布,因此,如果基于此假设,则对所有统计数据都加一点盐!

如果要排除异常值,请固定CPU频率,然后将进程固定到单个内核。但是,当中断处理程序或其他内核任务在该内核上进行大量工作,或者页面错误或其他任何操作时,您仍然会遇到异常情况。

或在具有超线程功能的CPU上,如果另一个线程在共享同一物理内核的同级逻辑内核上运行。或者同一台计算机上的另一个任务竞争共享资源,例如内存带宽或缓存占用量或磁盘I / O。

如果您对函数的功能以及Python的运行方式了解得足够多,则可以合理确定异常值不是“真实的”,即,您的进程在大部分壁钟中都没有CPU时间,或者发生了CPU迁移,那么您就可以丢弃超出某个阈值的异常值。

或者查看中位数时间而不是均值。中值对巨大的离群值不敏感,但仍会响应变化。

如果您重复使用相同的输入进行计时,因此您希望该功能花费相同的时间,则可以使用最小值。 (通常基本上等于中位数。)