定时代码执行时间

2024-05-12 20:47:42 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我对我正在设置的代码计时很感兴趣。借用第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()调用可能有问题。在


Tags: 函数代码importfortimedefrangestart
3条回答

根据clock的帮助文档:

Return the CPU time or real time since the start of the process or since the first call to clock(). This has as much precision as the system records.

clock的第二个调用已经返回了它与第一个clock调用之间经过的时间。您不需要手动减去start。在

改变

elasped = time.clock()-start

^{pr2}$

在修复了elapsed的第一个预期用途中的错误之后,您的代码可以在我的Linux系统上使用time.clock或{}(或者Py3的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次,只需执行以下操作:

import timeit

def foo():
    ...

print(timeit.timeit('foo()', 'from __main__ import foo', number=100))

它修复了我提到的大多数问题,方法是为您所在的操作系统选择最佳的计时功能(同时也修复了其他抖动源,例如循环垃圾收集,在测试期间被禁用,并在测试结束时重新启用)。在

{2{2,如果你想更高的分辨率,那么就请考虑使用高分辨率的Python。在

如果您想为函数计时,可以尝试一下装饰器(文档here):

import time

def timeit(f):    
    def timed(*args, **kw):
        ts = time.time()
        result = f(*args, **kw)
        te = time.time()
        print 'func:%r args:[%r, %r] took: %2.4f sec' % \
          (f.__name__, args, kw, te-ts)
        return result
    return timed

当你写一个函数时,你只需要使用decorator,这里:

^{pr2}$

这将打印出执行函数所需的时间:

func:'my_example_function' args:[(), {}] took: 0.4220 sec

相关问题 更多 >