【问题标题】:Make a timer using sleep in python. How to account for computation time?在 python 中使用 sleep 制作一个计时器。如何计算计算时间?
【发布时间】:2017-10-12 23:01:45
【问题描述】:

我正在尝试制作一个简单的计时器,它每秒打印剩余时间。

for k in range(100):
    print(100-k)
    t.sleep(1)
#output
#100
#99
#98
#...
#1

但是,这将花费比 100 秒稍长的时间,因为使用 print() 时会增加延迟。在很长一段时间内,这会略微明显。有没有办法解决这个问题,并准确地显示每一秒的时间?我知道我可以sleep(100),但这不会让剩下的时间被打印出来。

【问题讨论】:

  • 嗯,sleep 也不是完全准确,所以每次你sleeping 多一点或少一点不到一秒。
  • 你看过time.perf_counter吗?

标签: python python-3.x time timer


【解决方案1】:

使用time.sleep 永远不会为您提供准确的计时器时间,因为它所花费的时间是一秒睡眠时间+打印时间,您可以使用threading.Timer 获得更准确的结果。 https://repl.it/Hwkt

import threading, time

start_time=time.time()
def count_loop(counter):
  if counter <= 0: 
    print("it took  "+str(float(time.time()-start_time)*1000)+" Milliseconds")
    return

  threading.Timer(1.0, count_loop, args=[counter-1]).start()
  print(counter)      

count_loop(100)

这仍然不准确,但只有非常小的偏移量,只有 45 毫秒。但是,当使用来自 legendisback 示例的time.sleep 时,显然有 81 毫秒的延迟。 https://repl.it/HwlK

【讨论】:

    【解决方案2】:

    您可以使用time.time() 来测量经过的时间。

    import time
    start_time = time.time()
    
    for k in range(100):
        # k seconds SHOULD be elapsed at this point
        print(100 - k)
        slept_time = time.time() - start_time
        time.sleep(1 + k-slept_time)
    

    【讨论】:

      【解决方案3】:
      import time
      start_time=time.time()
      for k in range(25):
          print(25-k)
          time.sleep(1)
      print("it took  "+str(float(time.time()-start_time)*1000)+" Milliseconds")
      

      打印输出为:it took 26412.75382041931 Milliseconds

      没有打印的输出:it took 25053.035020828247 Milliseconds

      它应该只有 25000 毫秒,但它不是

      打印需要时间,即使阅读代码也需要时间 关键是不要指望 time.sleep() 的准确时间!!!

      【讨论】:

      • 这只是测量每个间隔所用的时间,但不会缩短它,使它们长一秒。
      • 不应该缩短它,这是表明 time.sleep() 不准确!
      猜你喜欢
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多