关于linux:如何在python中获得单调持续时间?

How do I get monotonic time durations in python?

我想记录真实壁挂时间有多长。 目前我这样做:

1
2
3
startTime = time.time()
someSQLOrSomething()
print"That took %.3f seconds" % (time.time() - startTime)

但是如果在SQL查询(或其他任何东西)运行时调整时间,则会失败(产生不正确的结果)。

我不想只是对它进行基准测试。 我想在实时应用程序中记录它,以便查看实时系统的趋势。

我想要像clock_gettime(CLOCK_MONOTONIC,...)这样的东西,但是在Python中。 并且最好不必编写调用clock_gettime()的C模块。


该函数非常简单,您可以使用ctypes来访问它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python

__all__ = ["monotonic_time"]

import ctypes, os

CLOCK_MONOTONIC_RAW = 4 # see <linux/time.h>

class timespec(ctypes.Structure):
    _fields_ = [
        ('tv_sec', ctypes.c_long),
        ('tv_nsec', ctypes.c_long)
    ]

librt = ctypes.CDLL('librt.so.1', use_errno=True)
clock_gettime = librt.clock_gettime
clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]

def monotonic_time():
    t = timespec()
    if clock_gettime(CLOCK_MONOTONIC_RAW , ctypes.pointer(t)) != 0:
        errno_ = ctypes.get_errno()
        raise OSError(errno_, os.strerror(errno_))
    return t.tv_sec + t.tv_nsec * 1e-9

if __name__ =="__main__":
    print monotonic_time()


现在,在Python 3.3中你将使用time.monotonic。


正如在这个问题中指出的那样,避免在Linux上进行NTP重新调整需要CLOCK_MONOTONIC_RAW。 在Linux上定义为4(从2.6.28开始)。

在Python的C头中容易地获取正确的常量#defined是很棘手的; 有h2py,但这并没有真正帮助你在运行时获得值。


以下是我在Python 2.7中获得单调时间的方法:

安装monotonic包:

1
pip install monotonic

然后在Python中:

1
2
3
4
5
import monotonic; mtime = monotonic.time.time #now mtime() can be used in place of time.time()

t0 = mtime()
#...do something
elapsed = mtime()-t0 #gives correct elapsed time, even if system clock changed.

time.monotonic()可能有用:

Return the value (in fractional seconds) of a monotonic clock, i.e. a clock that cannot go backwards. The clock is not affected by system clock updates. The reference point of the returned value is undefined, so that only the difference between the results of consecutive calls is valid.