Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测量GNU日期和Python时间模块之间纳秒的不同结果_Python_Gnu Coreutils - Fatal编程技术网

测量GNU日期和Python时间模块之间纳秒的不同结果

测量GNU日期和Python时间模块之间纳秒的不同结果,python,gnu-coreutils,Python,Gnu Coreutils,我想生成一个十六进制,它是自unix纪元以来的当前纳秒数。(不需要正确,只需要精确) 下面是如何在bash中获得当前纳秒数: ksoviero@ksoviero-Latitude-E7440:~$ date +%s%N 1401993044859711108 现在,要将其转换为十六进制,我们使用printf: ksoviero@ksoviero-Latitude-E7440:~$ printf '%x\n' $(date +%s%N) 1374e157ee379028 看看这有多容易 现在,

我想生成一个十六进制,它是自unix纪元以来的当前纳秒数。(不需要正确,只需要精确)

下面是如何在bash中获得当前纳秒数:

ksoviero@ksoviero-Latitude-E7440:~$ date +%s%N
1401993044859711108
现在,要将其转换为十六进制,我们使用
printf

ksoviero@ksoviero-Latitude-E7440:~$ printf '%x\n' $(date +%s%N)
1374e157ee379028
看看这有多容易

现在,让我们试着用Python做同样的事情。首先,我们得到当前纳秒:

>>> from time import time
>>> print int(time() * 10**9)
1401993206893091840
现在,我们将其转换为十六进制:

>>> print format(int(time() * 10**9), 'x')
1374e172f90a6400
我。。。什么!?结尾的那两个零是从哪里来的?它们总是在那里,不应该在那里

好的,等等,也许Python的十六进制函数不能处理那么大的数字。如果我们只是复制并粘贴纳秒会发生什么

>>> print format(1401993044859711108, 'x')
1374e13f086e6e84
等等,这奏效了


有人想猜猜是怎么回事吗?为什么直接给出时,纳秒的十六进制是正确的,而不是函数的结果?

末尾没有额外的零。您的错误是,您没有在两个print语句之间同时使用,并且没有看到前导的
0x
。如果将两个输出对齐:

0x1374e17396ef0800
  1374e172f90a6400
你看,没有多余的零

使用保存的时间值尝试以下操作:

>>> now = time()
>>> print format(int(now * 10**9), 'x')
1374e1ffdd1a5300
>>> print hex(int(now * 10**9))
0x1374e1ffdd1a5300

您可以看到输出是相同的。您需要在这两个print语句之间保存
time
的输出,否则当您调用它两次时,它将返回两个不同的值。

因为
time.time()
返回了一个浮点数,并且数学运算会导致精度错误。

如果您想要更高的精度,请允许我推荐
time.clock

导入时间

>>> format(int(time.clock()* 10**9), 'x')
'baaa3a9e9e9'
>>> format(int(time.clock()* 10**9), 'x')
'baba3cb2a5e'
>>> format(int(time.time()* 10**9), 'x')
'1374e44edaf2e400'
>>> format(int(time.time()* 10**9), 'x')
'1374e4500aeeb700'
(重点是我的):

在Unix上,以浮点数形式返回当前处理器时间 以秒表示。精确性,事实上就是定义 “处理器时间”的含义取决于C函数的含义 名称相同,但在任何情况下,这是用于 对Python或计时算法进行基准测试。

在Windows上,此函数返回自 根据 Win32函数QueryPerformanceCounter()。分辨率通常是 比一微秒好

无论如何,对于此处的任何实用程序,您可能期望的精度太高:

各种实时函数的精度可能小于 由表示其值或参数的单位表示。 例如,在大多数Unix系统上,时钟一周只“滴答”50或100次 第二

另一方面,time()和sleep()的精度比 它们的Unix等价物:时间表示为浮点数, time()返回可用的最精确时间(使用Unix) gettimeofday()和sleep()将接受带有 非零分数(Unix select()用于实现此功能,其中 可用)


问一个格式正确(阅读起来也很有趣)的问题真是太好了。等等,难道没有其他数字在这个十六进制中变化吗?@chepner,也许他只希望在1/256的时间里得到两个尾随的零。每次都能得到它是不寻常的。无论如何,这不是一个
bash
问题:
date
命令不是bash的一部分,而是GNU coreutils的一个独立工具,它可以从任何shell调用,也可以从任何shell调用……而且,不是将十六进制转换和时间戳度量合并到一个问题中,在提问之前,最好先检查哪一部分不准确(十六进制转换是否错误,或者时间测量的准确度是否低于预期)——这会让您问为什么使用Python的
time.time()测量的时间戳的低位8位总是为0,一个更好/更集中的问题。这不是我的意思,但我能看到困惑。我的字面意思是两个结果末尾的零,我不是在比较这两个结果。更新我的答案以给出一个例子。重要的是你要事先保存
time()
的值。有没有办法在Python中获得纳秒精度?如果你能在Bash中做到,那为什么不呢?在Google中输入这个精确的问题至少可以追溯到3年前。通读它们以了解问题。