【问题标题】:In Python, is time.time() * 1000 precise enough?在 Python 中, time.time() * 1000 是否足够精确?
【发布时间】:2012-11-08 00:40:33
【问题描述】:

我想在 python 中以亚秒级精度捕获时间戳。看起来标准答案是int(time.time() * 1000)

但是,如果time.time() 返回一个浮点数,你不会有精度问题吗?会有一些值不能准确地表示为浮点数。

我担心某些小数时间不能正确表示为浮点数,并且在这些情况下时间戳会向前或向后跳跃。

这是一个有效的担忧吗?

如果是这样,解决方法是什么?

【问题讨论】:

  • 如果是用于性能测量,那么您可以使用timeit.default_timer()
  • 您不想直接保留 time.time 的结果是否有特殊原因?乘以非二的幂肯定会混淆你的“精确度”;最好保留你得到的东西,然后只在最后舍入或截断。例如。 starttime = time.time(); DoStuff(); now = time.time(); elapsed = now - starttime; elapsedms = int(1000 * elapsed)
  • 我实际上是在尝试将测量结果放入时间“桶”中。所以我需要花一些绝对时间,除以一个周期长度,然后把测量结果扔到那个桶里。但我担心在那个计算中,一些测量值会落入错误的位置。但是,听起来我还可以;显示的错误是如此之小,以至于自然舍入可以解决它。
  • 好吧,见下文。我打算找个例子,我输入的第一个例子是 >>> int(1.001*1000) \ 1000 所以我必须用 >>> int(1.001* 1000+.1) \ 1001

标签: python time precision


【解决方案1】:

您想要多少精度?虽然确实存在不能表示为有限二进制分数的有限十进制分数,但只要您没有为运行 143 千年的程序计时( 2**52 毫秒)。

简而言之:我认为您无需为此担心浮点精度。不过,您可能需要担心系统计时器的准确性、精度或单调性。

【讨论】:

  • “最接近的近似值将四舍五入到正确的数字” ...所以我认为这是正确的答案,但需要注意的是我必须确保发生一些舍入。所以我将使用 int(time.time() * 1000 + 0.1) (参见上面评论中的示例)。如果你能找到错误,请告诉我!
  • 因为我不想一半上升一半下降。我真的很想截断——将第一毫秒视为新存储桶的开始。真的,因为我已经很挑剔了,所以我应该做一些类似 int(time.time() * 1000 + 0.0001) 的事情,这样我得到的唯一综合结果就是浮点精度错误。
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 2023-03-15
  • 2018-04-11
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多