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

StackOverflow https://stackoverflow.com/questions/1205722

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

  

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top