【问题标题】:python Time.clock too short resultpython Time.clock太短的结果
【发布时间】:2018-04-28 11:39:35
【问题描述】:

我在 python 中的 test time.clock() 函数中使用了这段代码

start = time.clock()
print(start)
time.sleep(3)
end = time.clock()
print(end)
print(end-start)

结果是

0.282109
0.282151
4.199999999998649e-05

文档说“在 Unix 上,将当前处理器时间作为浮点数返回,以秒为单位。”但是如果线程休眠了 3 秒,end-start 的结果怎么会这么低呢?

【问题讨论】:

  • "此函数的行为取决于平台:使用perf_counter()process_time() 代替,取决于您的要求,以获得明确定义的行为。"
  • 你在 Unix 上吗?因为它看起来像你得到Windows behavior“在Windows上,这个函数返回自第一次调用这个函数以来经过的挂钟秒数,作为一个浮点数,基于Win32函数QueryPerformanceCounter()。分辨率是通常优于一微秒。”
  • @PatrickHaugh 这是一个非常奇怪的挂钟,在 3 秒的睡眠中只过去了 0.00004 秒:P
  • @PatrickHaugh 我在 Unix 上
  • 如文档所述,它以秒为单位表达。不保证是一秒或多秒。在您的情况下,结果是 0.00004 秒。处理器时间与挂钟时间不同。

标签: python


【解决方案1】:

处理器时间是指通常所说的 CPU 时间,即处理器代表当前进程完成的工作量。如果你只睡了 3 秒钟,那几乎没有。

请改用time.time()

【讨论】:

    【解决方案2】:

    正如手册中引用的@decece,perf_counter() 将是一个更好的选择。

    import time
    
    start = time.perf_counter()
    time.sleep(3)
    end = time.perf_counter()
    
    print(end-start) # 3.003116666999631
    

    如果您想测试任意代码,timeit - module 是一个不错的选择:

    import timeit
    n = 4
    print( timeit.timeit( "time.sleep(3)", setup="import time", number=n)/n) 
    

    输出:

    3.00312000513
    

    您可以给它一个执行一次的setup= 代码,让它执行您的源代码number 次,使用其他默认设置获取所有执行的总时间。

    如果您再次除以数字,这将平均时间 - 使结果时间更加稳健。

    API:timeit


    您对sleep-method 的具体测量值会有所不同,因为它主要保证“至少”等待给定的秒数,具体取决于操作系统 - 重新调度和中断可能需要更长时间:

    此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意数量。

    在 3.5 版中更改:即使睡眠被信号中断,该函数现在至少睡眠几秒钟,除非信号处理程序引发异常(有关基本原理,请参阅 PEP 475)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 2013-10-31
      • 2013-10-24
      • 2014-10-11
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多