为什么 time.time() 的结果会减少到 50.85 秒?

27 浏览
0 Comments

为什么 time.time() 的结果会减少到 50.85 秒?

我想记录某个操作所花费的实际墙上时间。目前我是这样做的:

startTime = time.time()
someSQLOrSomething()
print "该操作花费了%.3f秒" % (time.time() - startTime)

但是,如果在运行SQL查询(或其他操作)时调整时间,这将导致失败(产生不正确的结果)。

我不仅仅想对其进行基准测试,我还想在实时应用程序中进行记录,以便在实时系统上查看趋势。

我想要的是类似于clock_gettime(CLOCK_MONOTONIC,...)的功能,但是用Python实现。最好不必编写调用clock_gettime()的C模块。

0
0 Comments

在Python 3.3+中,引入了time.monotonic函数,用于获取系统的单调时钟时间(monotonic clock time)。在CPython中,我认为它内部使用的是CLOCK_MONOTONIC,而不是CLOCK_MONOTONIC_RAW,而后者在Python 3.3中甚至不可用。

根据文档,Python 3.3中可以通过调用time.clock_gettime(time.CLOCK_MONOTONIC_RAW)来获取CLOCK_MONOTONIC_RAW,这非常好,因此当您使用它来测量小时间间隔时,不会因网络通过NTP(网络时间协议)调整时间而引入错误。

然而,在Python的time模块中,尽管它知道CLOCK_MONOTONIC_RAW的存在,但据我所见它并没有使用它。但是,您可以通过使用ctypes在Python 2.7上定义可以使用CLOCK_MONOTONIC_RAW的时钟。

对于Windows系统,可以直接调用time.clock()来获取微秒级或更好的分辨率,因为它使用了QueryPerformanceCounter()。

所以,为什么time.time()的结果会减少到50.85秒呢?这是由于在Python中,time.time()函数返回的是自纪元以来的时间,以秒为单位。当网络通过NTP调整时间时,会引入一定的误差。而使用CLOCK_MONOTONIC_RAW可以避免这种误差,但在Python 3.3中并没有直接提供获取CLOCK_MONOTONIC_RAW的方法。

要解决这个问题,可以使用time.clock_gettime(time.CLOCK_MONOTONIC_RAW)来获取CLOCK_MONOTONIC_RAW的时间,以避免由网络时间调整引入的误差。但需要注意的是,这个方法只适用于Unix/Linux系统。对于Windows系统,可以使用time.clock()来获取高分辨率的时间。

总结起来,要避免time.time()结果减少到50.85秒的问题,可以使用time.clock_gettime(time.CLOCK_MONOTONIC_RAW)获取CLOCK_MONOTONIC_RAW的时间,或者在Windows系统上使用time.clock()来获取高分辨率的时间。

0
0 Comments

为什么time.time()的结果会减少到50.85秒?

在这段代码中,使用了ctypes来访问一个简单的函数。该函数通过调用clock_gettime()来获取时间。clock_gettime()函数接受一个参数,指定了所需的时间类型。在这段代码中,使用的是CLOCK_MONOTONIC_RAW类型,它提供了一个基于硬件的原始时间,不受NTP调整的影响。所以,通过调用clock_gettime(CLOCK_MONOTONIC_RAW, ctypes.pointer(t))可以获取时间。

这段代码中出现的问题是,调用time.time()的结果减少到了50.85秒。通过阅读代码和相关评论,可以找到问题的原因和解决方法。

问题的原因是,代码中存在一个错误的写法。在调用clock_gettime()函数时,应该传递一个整数作为第一个参数,而不是一个常量。由于这个错误,导致了时间的计算结果出现了错误。

要解决这个问题,只需要修复代码中的错误写法即可。将clock_gettime(CLOCK_MONOTONIC_RAW , ctypes.pointer(t))中的CLOCK_MONOTONIC_RAW改为一个整数值即可。

另外,还有一些关于使用ctypes的建议和讨论,但与问题本身无关。所以在解决问题的过程中,不需要考虑这些建议和讨论。

调用time.time()的结果减少到50.85秒的原因是代码中存在一个错误的写法,解决方法是修复错误的写法。

0
0 Comments

问题的原因是在Linux上使用time.time()函数时,返回的结果会出现不连续的跳变。这是因为在Linux中,为了避免NTP的调整,需要使用CLOCK_MONOTONIC_RAW这个时钟。然而,在Python中要获取正确的常量值是比较困难的。

解决方法是使用ctypes库来调用C语言的函数,通过这种方式可以直接使用CLOCK_MONOTONIC_RAW这个时钟,并避免跳变的问题。下面是代码示例:

import ctypes
CLOCK_MONOTONIC_RAW = 4
class timespec(ctypes.Structure):
    _fields_ = [
        ('tv_sec', ctypes.c_long),
        ('tv_nsec', ctypes.c_long)
    ]
librt = ctypes.CDLL('librt.so.1', ctypes.RTLD_GLOBAL)
clock_gettime = librt.clock_gettime
clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]
def monotonic_time():
    t = timespec()
    clock_gettime(CLOCK_MONOTONIC_RAW, ctypes.pointer(t))
    return t.tv_sec + t.tv_nsec * 1e-9
print(monotonic_time())

通过使用C语言的clock_gettime函数,并传入CLOCK_MONOTONIC_RAW参数,可以获取到连续的时间值,避免了跳变的问题。

0