在python3.7中,如何精确地测量返回值的函数的cpu时间?

2024-04-20 03:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图测量一个小函数的cpu时间,这个函数通常需要1500微秒。我有时得到不准确或广泛的置信区间。我想找到在python3.7中对函数进行基准测试的最准确的方法。我想测量函数time+获取其他计算的返回值。你知道吗

我试着从timeit中取消计时器,请看下面的代码。你知道吗

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%的平均值。你知道吗


Tags: 方法函数fortime时间基准cput1
1条回答
网友
1楼 · 发布于 2024-04-20 03:53:34

如果(例如)您的进程在执行期间被迁移到另一个CPU,那么获取异常值是正常的。(所以所有的内存访问都会在缓存中丢失一段时间,因为上一个内核上的L1d和L2都很热)。这在现实生活中也可能发生。你知道吗

所以你必须决定你想要测量的是什么:正常的,没有奇怪发生的情况,或者包括最坏情况在内的完全分布。你知道吗

如果你保留这些异常值,那绝对不是高斯正态分布,所以如果它们是基于这个假设的话,那就拿任何统计数字来说吧!你知道吗

如果要排除异常值,请固定CPU频率,并将进程固定到单个核心。但是,当中断处理程序或其他内核任务在该内核上做了大量工作,或出现页面错误或其他任何情况时,仍然可以得到异常值。你知道吗

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

如果您对函数的作用以及Python如何运行函数有足够的了解,可以合理地确定异常值不是“真实的”,也就是说,您的进程在大部分时间都没有CPU,或者发生了CPU迁移,那么您就可以丢弃高于某个阈值的异常值。你知道吗

或查看时间中位数而不是平均值。中位数对巨大的异常值不敏感,但仍会对变化作出反应。你知道吗

如果重复使用相同的输入计时,因此希望函数占用相同的时间,则可以使用最小值。(通常基本上等于中间值。)

相关问题 更多 >