所以,我对我正在设置的代码计时很感兴趣。借用第4版学习Python中的计时器函数,我尝试:
import time
reps = 100
repslist = range(reps)
def timer(func):
start = time.clock()
for i in repslist:
ret = func()
elasped = time.clock()-start
return elapsed
然后,我粘贴任何我想计时的东西,然后写上:
^{pr2}$当我在我的代码上运行它时,我确实得到了一个答案,但这是无稽之谈。怀疑出了什么问题,我在代码中添加了一个time.sleep(0.1)
调用,结果是0.8231
有人知道为什么会这样吗?或者怎么解决?我怀疑time.clock()
调用可能有问题。在
根据
clock
的帮助文档:对
clock
的第二个调用已经返回了它与第一个clock
调用之间经过的时间。您不需要手动减去start
。在改变
到
^{pr2}$在修复了}(或者Py3的
elapsed
的第一个预期用途中的错误之后,您的代码可以在我的Linux系统上使用time.clock
或{time.monotonic
)在我的Linux系统上正常工作。在区别在于
clock
的(特定于操作系统的)行为;在大多数类UNIX的操作系统上,它将返回程序自启动以来使用的处理器时间(因此,阻塞、I/O、锁、页面错误等所花费的时间将不计算在内),而在Windows上,它是一个挂钟计时器(因此阻塞的时间将被计算在内),从第一次启动开始算起秒数打电话。在当
clock_t
只有32位时,如果在长时间运行的程序中使用time.clock
的类UNIX版本也是相当不可靠的;它返回的值大约每处理器时间的72分钟包装一次。在当然,
time.time
也不是完美的;它遵循系统时钟,因此在调用之间发生的NTP时间更新(或对系统时钟的任何其他更改)将给出错误的结果(在python3.3+上,您应该使用time.monotonic
来避免这个问题)。它也不能保证粒度小于1秒,所以如果你的函数运行时间不长,在低分辨率的系统上,你不会得到特别有用的结果。在实际上,您应该看看为此设计的Python电池(它还可以处理垃圾收集开销等问题)。^{} module 已经有一个函数可以执行您想要的操作,但是可以处理我提到的所有边缘情况和问题。例如,要将某个名为
foo
的全局函数计时100次,只需执行以下操作:它修复了我提到的大多数问题,方法是为您所在的操作系统选择最佳的计时功能(同时也修复了其他抖动源,例如循环垃圾收集,在测试期间被禁用,并在测试结束时重新启用)。在
{2{2,如果你想更高的分辨率,那么就请考虑使用高分辨率的Python。在
如果您想为函数计时,可以尝试一下装饰器(文档here):
当你写一个函数时,你只需要使用decorator,这里:
^{pr2}$这将打印出执行函数所需的时间:
相关问题 更多 >
编程相关推荐