比较具有亚秒精度的时间

36

如何获得自纪元以来的毫秒数?

请注意,我想要实际的毫秒数,而不是将秒乘以1000。我正在比较需要毫秒精度的不到1秒的时间。 (我查看了许多答案,它们似乎都有*1000)

我正在比较POST请求中获取的时间与服务器上的结束时间。 我只需要两个时间处于相同的格式,无论是什么格式。 我认为Unix时间可以工作,因为Javascript有一个函数可以获取它。


如果您需要毫秒级别的准确性,您确定需要绝对时间(自纪元以来)吗?通常,这种精度只在相对意义上需要,比如相对于计算机启动时。 - Thomas
2
我正在比较从POST请求中获取的时间和服务器上的结束时间。实际上,我只需要这两个时间以相同的格式呈现,无论是什么格式。我认为Unix时间会起作用,因为JS有一个函数可以获取它。 - user984003
你可能想要使用time.perf_counter()(只有相对值才有意义)来测量短时间间隔,而不是由time.time()提供的绝对时间。 - jfs
6个回答

30

time.time() * 1000 如果可能的话,将会给你毫秒级别的精度。


20

int(time.time() * 1000)会实现你所需的功能。time.time()通常返回一个双精度浮点数,表示自纪元以来经过的秒数,因此乘以1000不会影响精度。

对于@kqr误导性答案的另一个说明:time.clock()不能给出纪元时间。对于Unix系统,它给出进程在CPU上运行的时间,而对于Windows系统,它给出自函数第一次调用以来经过的时间,请参见Python文档

此外,确实有文档说明time.time()无法保证毫秒级精度。尽管这主要是为了确保您不依赖于嵌入式或早期硬件上的这种精度,但我不知道任何例子,您无法获得毫秒级精度。


15

我看到很多人建议使用 time.time()。虽然time.time()是衡量实际日期时间的准确方法,但是它不能保证给出毫秒级精度!从文档中可以看出:

请注意,尽管时间始终作为浮点数返回,但并非所有系统都提供比1秒更高的精度。虽然此函数通常返回不递减值,但如果在两次调用之间系统时钟被设置回,则它可能会返回低于先前调用的值。

这不是你在比较两个时间时想要的过程!它可能会以许多有趣的方式失败,而你无法判断发生了什么。事实上,在比较两个时间时,你并不真正需要知道当前时间,只需要知道两个值具有相同的起始点。为此,time库提供了另一个过程:time.clock()。文档说:

在Unix上,返回当前处理器时间作为以秒为单位的浮点数。精度,事实上,甚至“处理器时间”的含义的定义,取决于同名C函数的定义,但无论如何,这是用于基准测试Python或计算算法时间的功能。

在Windows上,此函数返回自第一次调用此函数以来经过的挂钟秒数,作为浮点数,基于Win32函数QueryPerformanceCounter()。分辨率通常比一微秒更好

使用time.clock()


或者,如果你只是想测试代码运行速度,可以方便地使用timeit.timeit(),它会为你做所有的测量,并且是代码执行中测量经过时间的事实标准方法。


2
因此,在Unix上,“clock()”不适用。正如您引用的那样,它计算的是处理器时间,这与挂钟时间甚至相对方式也不同。 - glglgl
1
如果您只是想比较两个时间点,计算两次 clock() 函数调用之间的差值会给出最准确的经过时间。使用 time() 函数可能无法精确测量时间差,甚至可能会得到负数 - kqr
2
如果您同时运行多个程序,系统会变得更慢。这些程序需要更多的挂钟时间,但是相同的CPU时间。如果您需要精确的时间,这可能会产生巨大的差异。 - glglgl
4
这个程序 展示了这种差异。如果我运行程序到最后,最后调用 fac() 的需要占用大约 0.58 秒的 CPU 时间,但实际时间却是约 7.5 秒。这是因为它们没有得到完全的 CPU 注意力,一个原本只需要在 0.58 秒内完成的任务由于并行处理而需要花费 7.5 秒的时间。 - glglgl
2
如果你要将结果放入数据库中,请务必先转换为字符串,因为Python会在长整数后面加上“L”。这是典型的Python问题,但今天我被它坑了。 - ChronoFish
显示剩余8条评论

14

使用datetime库:

>>> import datetime
>>> delta = datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)
>>> delta
datetime.timedelta(15928, 52912, 55000)
>>> delta.total_seconds()
1376232112.055
>>> delta.days, delta.seconds, delta.microseconds
(15928, 52912, 55000)

3
除非当前的UTC偏移量与1970年完全相同,否则这是不正确的。请使用.utcnow()更多信息 - jfs

2

-4
import datetime
time = datetime.datetime.now()
ms = time.microsecond

返回一个6位数字,微秒。由于PC使用的是比微秒慢的滴答数,因此最后3位数字在PC上无用。前3位数字应该足够满足您的需求。

2
“在电脑上没用,因为它使用的是ticks,比微秒慢。”有趣。 - Hyperboreus
4
这不会给你从纪元开始算的毫秒数,而是自上一秒开始算的毫秒数。 - Michael
我很好奇为什么在这个页面上经常看到“epoche”这个拼写。谷歌搜索说,“Epoche是维多利亚州卡利斯塔的一个可爱礼品店”,这可能不是人们的意思。有一个古希腊术语Epoché,可能是现代英语单词“epoch”的来源。但在我查过的每一本字典中,“epoch”都是正确的拼写……除非“epoche”是另一种“美式英语”拼写…… - Michael Scheper
1
@MichaelScheper 只有当你将偶然的拼写错误视为美式英语时才是如此。由于本页面上的两个实例都来自同一用户,我们可以推断他要么是弄错了,要么是故意回到希腊源头。 - Hobbes

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