所以,我有兴趣计时我正在设置的一些代码。借用第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
然后,我粘贴在我想要的任何时间,并把:
print(timer(func)) #replace func with the function you want to time
当我在我的代码上运行它时,我确实得到了答案,但这是无稽之谈。怀疑某些事情是错误的,我在我的代码中调用了time.sleep(0.1)
,得到了0.8231
有人知道为什么会出现这种情况或如何解决这个问题?我怀疑time.clock()
电话可能有问题。
答案 0 :(得分:2)
根据clock
的帮助文档:
返回自进程启动以来或自第一次调用clock()以来的CPU时间或实时。这与系统记录一样精确。
对clock
的第二次调用已经返回了它与第一个clock
调用之间经过的时间。您无需手动减去start
。
更改
elasped = time.clock()-start
到
elasped = time.clock()
答案 1 :(得分:1)
如果你想定时一个函数,也许可以尝试装饰器(文档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
然后当你编写一个函数时,你只需使用装饰器,这里:
@timeit
def my_example_function():
for i in range(10000):
print "x"
这将打印出执行该功能的时间:
func:'my_example_function'args:[(),{}]花了:0.4220秒
答案 2 :(得分:0)
在elapsed
的第一个预期用途中修正拼写错误后,我的代码可以正常使用time.clock
或time.time
(或Py3的time.monotonic
) Linux系统。
区别在于clock
的(特定于操作系统)行为;在大多数类似UNIX的操作系统上,它将返回程序自启动以来所使用的处理器时间(因此在I / O,锁定,页面错误等方面花费的时间不会计算),而在Windows上它是一个挂钟计时器(因此被阻止的时间会计算)计算自第一次调用以来的秒数。
如果在time.clock
仅为32位的情况下在长时间运行的程序中使用,那么类似UNIX的clock_t
版本也相当不可靠;它返回的值大约每72分钟处理一次。
当然,time.time
也不完美;它遵循系统时钟,因此在调用之间发生的NTP时间更新(或系统时钟的任何其他更改)将产生错误的结果(在Python 3.3+上,您使用time.monotonic
来避免此问题)。它也不能保证粒度小于1秒,所以如果你的函数运行时间不是很长,那么在低分辨率time.time
的系统上你将得不到特别有用的结果。
真的,你应该看看为此设计的Python电池(它还处理诸如垃圾收集开销之类的问题)。 timeit
module已经有一个功能可以完成您想要的功能,但可以处理我提到的所有边缘情况和问题。例如,要为一个名为foo
的全局函数计时100次,你只需执行:
import timeit
def foo():
...
print(timeit.timeit('foo()', 'from __main__ import foo', number=100))
它通过为您所选择的操作系统选择最佳计时功能来解决我提到的大多数问题(并且还修复了其他抖动源,例如循环垃圾收集,在测试期间禁用并在最后重新启用)
即使您出于某种原因不想使用它,如果您使用的是Python 3.3或更高版本,请查看time.clock
的替换内容,例如time.perf_counter
(包括睡眠时间)或time.process_time
(仅包括CPU时间),两者都具有便携性,可靠性,快速性和高分辨率,以提高准确性。
答案 3 :(得分:-1)
time.sleep()
将针对任何信号终止。在这里阅读...