Pergunta

Eu quero registrar quanto tempo alguma coisa leva em walltime real. Atualmente eu estou fazendo isso:

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

Mas isso irá falhar (produzir resultados incorretos) se o tempo é ajustado enquanto a consulta SQL (ou seja o que for) está em execução.

Eu não quero apenas referência-lo. Eu quero registrá-lo em uma aplicação ao vivo, a fim de ver as tendências em um sistema vivo.

Eu quero algo como clock_gettime (CLOCK_MONOTONIC, ...), mas em Python. E de preferência sem ter que escrever um módulo C que as chamadas clock_gettime ().

Foi útil?

Solução

Essa função é bastante simples que você pode usar ctypes para acessá-lo:

#!/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()

Outras dicas

Agora, em Python 3.3 você usaria time.monotonic .

Como apontado em esta questão , evitando NTP reajustes no Linux requer CLOCK_MONOTONIC_RAW. Isso é definido como 4 em Linux (desde 2.6.28).

portably recebendo a constante correta #defined em um cabeçalho C do Python é complicado; há h2py, mas que realmente não ajudá-lo a obter o valor em tempo de execução.

Aqui está como eu ter tempo monotônica no Python 2.7:

Instale o pacote monotonic:

pip install monotonic

Então, em 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() pode ser útil:

retornar o valor (em frações de segundo) de um relógio monótona, ou seja, um relógio que não pode ir para trás. O relógio não é afetado por atualizações relógio do sistema. O ponto de referência do valor retornado é indefinido, de modo que apenas a diferença entre os resultados de chamadas consecutivas é válido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top