计算机处理速度方差问题:算法运行时间波动大的原因探究
为什么测试算法运行时长的结果方差这么大?
先还原你的测试代码(我稍微调整了格式方便阅读):
import time n = 0 x = [] for k in range(1, 10): begin = time.time() while (n < 1E7): n += 1 end = time.time() x.append(end - begin) print(x) n = 0 print(x)
你运行得到的结果:
[2.755953550338745, 2.234074831008911, 2.719917058944702, 2.4802486896514893, 2.8635189533233643, 2.7834832668304443, 4.048354387283325, 3.454935312271118, 3.3593692779541016]
确实结果波动非常明显,核心原因是你的测试环境并非完全孤立,操作系统和Python解释器本身的机制都会干扰测试结果,具体拆解成这几点:
操作系统进程调度的干扰:你的电脑不会只跑这一段Python脚本,后台还有各种系统进程、服务(比如杀毒软件、系统更新、桌面组件)在争夺CPU资源。操作系统会给每个进程分配时间片,当其他高优先级进程抢占CPU时,你的脚本会被暂时挂起,直接导致单次循环耗时变长——比如那个4秒的结果,大概率是测试期间有其他进程占用了大量CPU资源。
Python自动垃圾回收(GC)的影响:Python解释器会在后台自动执行垃圾回收,回收不再使用的内存。如果某次测试循环刚好撞上GC运行,GC会占用一部分CPU时间,自然会拉高你的测试耗时。
CPU缓存与动态调频的波动:
- CPU有多级缓存,第一次循环时数据和指令还没进入缓存,执行速度会稍慢;后面几次循环缓存命中,速度会变快。但如果中间有其他进程占用了缓存,你的脚本再次运行时又得重新加载缓存,速度就会回落。
- 现在的CPU都有动态调频功能,刚开始测试时CPU可能处于低功耗状态,频率较低;运行一段时间后频率拉满,速度变快,但如果CPU温度过高,又会自动降频,导致速度变慢。
测试方法的小瑕疵:你这种单轮短测试很容易被外界干扰。更好的做法是多次重复测试取平均值,或者用Python专门的性能测试工具
timeit——它会自动处理很多干扰因素,结果方差会小很多。比如用timeit测试的代码可以写成:
import timeit print(timeit.timeit("n = 0; while n < 10**7: n +=1", number=5))
内容的提问来源于stack exchange,提问作者SebVC
相关产品推荐
相关产品推荐

