Python中魔法命令%time与%timeit的区别及%%timeit循环结束后无限运行的原因探究
Python魔法命令%time和%timeit的区别,以及%%timeit无限运行的问题
嘿,我来帮你搞清楚这两个IPython魔法命令的区别,还有你遇到的那个“无限运行”的坑!
一、%time 和 %timeit 的核心差异
- %time:只执行一次目标代码,直接返回这次运行的总耗时。适合快速查看单次运行的时间,尤其是像你写的
timer(10)这种本身运行时间就比较长、不需要多次统计的代码,跑一次就能得到结果。 - %timeit:它的核心是精准统计代码的平均执行效率。默认情况下,它会自动调整运行次数(比如先跑几次试试水,然后确定合适的重复次数),多次重复执行目标代码,最后返回平均耗时,用来抵消系统波动对时间统计的影响。这种设计更适合测试小段、快速运行的代码性能,比如几行计算逻辑的耗时。
二、为什么你的%%timeit会看起来“无限运行”?
先看你的代码:
from time import sleep def timer(limit): for ran in range(0, limit): print(ran) sleep(1) # 第二个单元格的代码 %%timeit timer(10)
问题出在%timeit的运行逻辑上:它为了得到可靠的平均时间,会反复执行你的代码块很多次。你的timer(10)每次运行要花10秒(循环10次,每次sleep1秒),而%timeit默认会跑多轮测试,你看不到print输出(因为%timeit默认屏蔽了标准输出),所以就会误以为程序卡住无限运行了——实际上它只是在一遍又一遍地调用timer(10)而已。
解决方法
如果非要用%%timeit测试这种耗时较长的函数,可以手动指定运行次数和轮数,强制它只跑一次:
%%timeit -n 1 -r 1 timer(10)
参数解释:
-n 1:表示每轮测试只执行1次代码-r 1:表示只进行1轮测试
这样它就只会运行一次timer(10),效果和%time类似,但还是会给出统计结果(虽然只有一组数据)。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

