Как я могу получить монотонную продолжительность в питоне?

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

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

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

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

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

5 ответов

Решение

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

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

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

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

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

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

Другие вопросы по тегам