Точное время в нано секундах для Python 3.6 и ранее? - PullRequest
1 голос
/ 20 апреля 2019

Я использовал такой взлом во многих моих кодах:

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

Он работает вокруг ограничений Python 3.6 и более ранних версий, у которых не было метода time_ns.Проблема заключается в том, что вышеуказанный обходной путь основан на time.time, который возвращает число с плавающей запятой.В UTC 2019 года это примерно с точностью до микросекунды.

Как мне реализовать time_ns для более старых версий Python с полной точностью до наносекунды?(В первую очередь для UNIX-подобных систем.)

1 Ответ

0 голосов
/ 20 апреля 2019

Глядя на исходный код CPython , можно получить следующее:

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-подобных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...