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

yi0zb3m4  于 2023-08-03  发布在  Linux
关注(0)|答案(5)|浏览(120)

我想记录下在真实的的墙里做某件事需要多长时间。目前我正在做:

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

字符串
但如果在SQL查询(或其他查询)运行时调整时间,则会失败(产生不正确的结果)。
我不想只是做基准测试。我想将其记录在一个实时应用程序中,以便在实时系统上查看趋势。
我想要类似clock_gettime(CLOCK_MONOTONIC,...)的东西,但是在Python中。并且最好不必编写调用clock_gettime()的C模块。

new9mtju

new9mtju1#

该函数非常简单,可以使用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()

字符串

e3bfsja2

e3bfsja22#

在Python 3.3+中有time.monotonic(参见PEP 418)。

2lpgd968

2lpgd9683#

正如this question中所指出的,在Linux上避免NTP重新调整需要CLOCK_MONOTONIC_RAW。这在Linux上被定义为4(自2.6.28起)。
从Python中可移植地获取C头文件中定义的正确常量#是很棘手的;有一个h2 py,但它并不能真正帮助你在运行时获取值。

watbbzwu

watbbzwu4#

下面是我在Python 2.7中获得单调时间的方法:
安装monotonic软件包:

pip install monotonic

字符串
在Python中:

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.


编辑:在信任它之前,请检查上述操作是否在您的目标操作系统上工作。单调库似乎在某些操作系统中处理时钟变化,而在其他操作系统中则不处理。

nwlls2ji

nwlls2ji5#

time.monotonic()可能有用:
返回单调时钟的值(以小数秒为单位),即不能倒退的钟。时钟不受系统时钟更新的影响。返回值的引用点是未定义的,因此只有连续调用的结果之间的差异才有效。

相关问题