IPython %%timeit -n 2运行结果与预期不符问题咨询
%%timeit魔术命令的实际执行逻辑说明 你碰到的数组追加元素数和-n 2参数预期不符的问题,本质是对timeit的参数定义和执行机制有误解,实际运行规则是这样的:
-n参数定义的是单轮计时循环内的代码执行次数,不是全局总执行次数。
你设置-n 2的实际含义是:每一轮计时测试里,会连续跑2次myArray.append("1"),再统计这2次执行的总耗时、算出单次平均耗时。- timeit默认会跑多轮计时循环,用来抵消系统波动带来的统计误差,对应控制轮次的参数是
-r,Colab用的IPython内核里,-r默认值是7,也就是默认会跑7轮正式计时,每轮都执行n次目标代码。 - 正式计时开始前,timeit还会自动跑若干次预热,用来消掉Python解释器首次加载代码、缓存初始化带来的额外开销,这部分预热过程中跑的代码,同样会真实修改你在单元格外面定义的全局变量
myArray。
按这个逻辑算,你写的这段代码总执行次数=(预热运行次数 + 正式轮次数)* 单轮执行次数2,最后数组长度远大于2完全是符合设计预期的。
补充提醒:
%%timeit是专门做性能基准测试的工具,别指望靠它执行过程中对外部变量的修改做逻辑验证。如果要固定执行次数同时统计耗时,自己写循环调用time.perf_counter()手动计时就行,不会出现执行次数不可控的问题。
你可以显式指定轮次参数验证这个逻辑:
# 先重置为空数组 myArray = []
%%timeit -n 2 -r 1 myArray.append("1")
跑完之后查len(myArray),你会发现结果依然不是2——多出来的元素就是预热运行阶段追加的。
内容的提问来源于stack exchange,提问作者fransua
相关产品推荐
相关产品推荐

