Python 3.6和更早版本的精确时间(以纳秒为单位)?

时间:2019-04-20 13:36:30

标签: python python-3.x time

我在很多代码中都使用过这种黑客手段:

import time
if not hasattr(time, 'time_ns'):
    time.time_ns = lambda: int(time.time() * 1e9)

它可以解决Python 3.6及更早版本(没有time_ns方法)的限制。问题是上述解决方法基于time.time,该方法返回浮点数。在2019年的UTC中,这大约精确到微秒级。

我如何为 full 纳秒精度的旧版本Python实现time_ns? (主要针对类似UNIX的系统。)

1 个答案:

答案 0 :(得分:0)

看看CPython source code,可以得出以下结论:

import ctypes

CLOCK_REALTIME = 0

class timespec(ctypes.Structure):
    _fields_ = [
        ('tv_sec', ctypes.c_int64), # seconds, https://stackoverflow.com/q/471248/1672565
        ('tv_nsec', ctypes.c_int64), # nanoseconds
        ]

clock_gettime = ctypes.cdll.LoadLibrary('libc.so.6').clock_gettime
clock_gettime.argtypes = [ctypes.c_int64, ctypes.POINTER(timespec)]
clock_gettime.restype = ctypes.c_int64    

def time_ns():
    tmp = timespec()
    ret = clock_gettime(CLOCK_REALTIME, ctypes.pointer(tmp))
    if bool(ret):
        raise OSError()
    return tmp.tv_sec * 10 ** 9 + tmp.tv_nsec

以上内容适用于类似64位UNIX的系统。