为何统计迭代次数的定时循环每次试验返回的矩阵结果不完全一致?
为什么这段定时循环计数的代码每次运行结果不一致
你写的这段忙等计数代码如下:
from datetime import datetime, timedelta import numpy as np ntrials = int(input("number of trials? ")) nobs = int(input("number of observations? ")) for t in range(1,ntrials+1): print("\ntrial:",t,"\n") data = [] for n in range(nobs): obs = [] for duration in np.array([0.1,0.2,0.3,0.4,0.5]): count = 0 end_time = datetime.now() + timedelta(seconds=duration) while datetime.now() < end_time: count += 1 obs.append(count) data.append(obs) print(np.array(data))
结果无法保持完全一致是必然的,核心影响因素如下:
- 操作系统调度不是实时独占的:普通桌面/服务器操作系统都采用抢占式调度,你的Python进程运行时会随时被系统打断,把CPU资源分配给系统后台服务、其他运行中的软件,每次被抢占的时机、被挂起的时长完全不固定,相同墙钟时间内你的循环实际能拿到的CPU执行时间每次都有差异,计数自然不会一样。
- 时间调用本身存在误差和开销波动:
datetime.now()是需要陷入内核的系统调用,本身执行耗时不是固定值,会随系统当前负载波动;同时通用操作系统的系统时钟本身存在精度限制,Windows默认时钟粒度约10-15ms,Linux也有1ms级别的误差,循环终止的判断时间点每次都会有偏移。 - 运行环境的动态波动:Python解释器执行字节码的效率、内存分配的开销会受解释器当前状态、系统内存占用影响;现代CPU还会根据温度、负载动态调整运行频率,节能降频、睿频都会直接改变单位时间内能执行的指令总数,进一步放大计数结果的差异。
这种忙等计数统计到的本质是系统瞬时的性能状态,本身就不是固定值。哪怕同一次运行过程中,连续两次统计相同时长的计数,结果也大概率存在差异。如果要获得相对稳定的基准测试结果,需要提前关闭系统后台程序、禁用CPU动态调频、给测试进程设置最高调度优先级,但即便如此也无法做到跨次运行结果100%完全一致。
内容的提问来源于stack exchange,提问作者D. Yeo
相关产品推荐
相关产品推荐

