Как я могу получить монотонную продолжительность в питоне? - PullRequest
51 голосов
/ 30 июля 2009

Я хочу записать, сколько времени занимает что-то в реальном времени. В настоящее время я делаю это:

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

Но это не удастся (приведет к неправильным результатам), если время будет настроено во время выполнения запроса SQL (или чего-то еще).

Я не хочу просто оценивать это. Я хочу войти в приложение в реальном времени, чтобы увидеть тенденции в действующей системе.

Я хочу что-то вроде clock_gettime (CLOCK_MONOTONIC, ...), но в Python. И желательно без необходимости писать модуль C, который вызывает clock_gettime ().

Ответы [ 5 ]

74 голосов
/ 30 июля 2009

Эта функция достаточно проста, чтобы вы могли использовать 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()
33 голосов
/ 19 января 2013

Теперь в Python 3.3 вы будете использовать time.monotonic .

9 голосов
/ 20 декабря 2010

Как указано в в этом вопросе , для предотвращения перенастройки NTP в Linux требуется CLOCK_MONOTONIC_RAW. Это определено как 4 в Linux (начиная с 2.6.28).

Переносить правильную константу #defined в заголовке C из Python сложно; есть h2py, но на самом деле это не поможет вам получить значение во время выполнения.

3 голосов
/ 29 января 2018

Вот как я получаю монотонное время в 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.
0 голосов
/ 08 мая 2017

time.monotonic() может быть полезно:

Возвращает значение (в долях секунды) монотонных часов, то есть часов, которые не могут двигаться назад. Обновление системных часов не влияет на часы. Контрольная точка возвращаемого значения не определена, поэтому допустима только разница между результатами последовательных вызовов.

...