Как я могу получить монотонную продолжительность в питоне?
Я хочу записать, сколько времени занимает что-то в реальном времени. В настоящее время я делаю это:
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()
Как указано в этом вопросе, для предотвращения перенастройки 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()
может быть полезно:
Возвращает значение (в долях секунды) монотонных часов, т.е. часов, которые не могут двигаться назад. На часы не влияют обновления системных часов. Контрольная точка возвращаемого значения не определена, поэтому допустима только разница между результатами последовательных вызовов.