如何在Python中获得单调时间?

我想logging在真实的墙上时间需要多长时间。 目前我正在这样做:

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

但是,如果在SQL查询(或其它)正在运行的时候调整时间,那将会失败(产生不正确的结果)。

我不想只以它为基准。 我想将其login到实时应用程序中,以便查看实时系统上的趋势。

我想要的东西像clock_gettime(CLOCK_MONOTONIC,…),但在Python中。 最好不用写一个调用clock_gettime()的C模块。

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

 #!/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中获取正确的常量#define是很棘手的; 有h2py,但是这并不能真正帮助你在运行时获得这个值。

time.monotonic()可能是有用的:

返回单调时钟的值(小数秒),即不能倒退的时钟。 时钟不受系统时钟更新的影响。 返回值的参考点是未定义的,因此只有连续调用的结果之间的差异是有效的。