为什么 time.time() - time.time() 的结果为 0.0?

3
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import time
>>> time.time() - time.time()
0.0

为什么会这样呢?从我的简单理解来看,这个函数返回的是系统时钟自纪元以来经过的秒数,准确到调用时刻。但是两次调用time.time()难道不应该返回稍微不同的浮点数吗?


2
我得到了另一个结果 >>>> time() - time() -1.9073486328125e-06。也许你的电脑太快了 (: - aiven
1
每次运行都是0.0吗? - Sterling Archer
顺便说一下,在我的机器上运行[time.time() for _ in range(50)]会生成大约11个独特的时间戳。 - alecxe
取决于操作系统使用的时间片。time.time() - time.time() -> -9.5367431640625e-07 - Daniel
1
我在Python 2上尝试了这个,每3-4次中有1次得到了0.0的结果。但是我在Python 3上尝试了20多次,从未得到过0.0。 - John Gordon
显示剩余4条评论
4个回答

5
计时器的分辨率是有限的,它会定期地以小幅度增加。如果两个调用非常接近,则会看到零值。如果您尝试大量这样的调用,您可能会发现差异大部分时间为零,其余时间为一些微秒数,这取决于您特定系统的速度、硬件细节和内核实现。

谢谢,我相信“足够接近”就是我的情况。 - NPE_Exception

3
根据time.time文档
尽管时间总是以浮点数返回,但并非所有系统都提供比1秒更好的精度
(我的强调)。 对于Python3.3+,请使用time.perf_counter。 或者对于Python3.2或更早版本,或者对于向后兼容性,请使用timeit.default_timer,它会尝试为您的系统选择最准确的时钟。

你知道有哪些系统无法提供比1秒更好的精确度吗? - Jacob Lee
@JacobLee:我不确定文档所指的是不是这个,但根据Windows的配置方式,它可能只提供1秒的精度。(该链接是通过这个问题找到的。) - unutbu
感谢您关注此事。测量区间t2 - t1的准确度取决于时钟的稳定性和时钟的精度或分辨率(最小时间增量),而不取决于时间1和时间2是否相对于权威时钟具有“真实”时钟时间。当然,Python可以运行在各种系统上,而time.time()则依赖于该名称的系统相关C程序,因此可能存在一些开放式警告。 - Jacob Lee

2

并非总是如此,这取决于您的 CPU 调度和时钟:

n, d = 0, 0.0
while d == 0.0:
     d = time.time() - time.time()
     n += 1
print(n, d)

26096 -0.0010001659393310547

谢谢,我认为这个函数是我能够理解发生了什么的最好方式。 - NPE_Exception

0

Python的time.time()生成自纪元以来经过的时间量,以微秒的三分之一为单位,我喜欢称之为增量。这意味着每秒钟有3百万个增量。

就像时钟只报告最接近的秒数一样,Python只会报告最接近的增量时间。因此,如果您的代码可以在时间移动到下一个增量之前完成,它将报告为0.0!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接