web-dev-qa-db-fra.com

Comment obtenir des durées monotoniques en python?

Je veux enregistrer combien de temps prend quelque chose en temps réel. Actuellement je fais ça:

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

Mais cela échouera (produira des résultats incorrects) si l'heure est ajustée pendant l'exécution de la requête SQL (ou quoi que ce soit d'autre).

Je ne veux pas simplement le comparer. Je souhaite le connecter à une application en direct afin de voir les tendances sur un système en direct.

Je veux quelque chose comme clock_gettime (CLOCK_MONOTONIC, ...), mais en Python. Et de préférence sans avoir à écrire un module C qui appelle clock_gettime ().

48
Thomas

Cette fonction est assez simple pour que vous puissiez utiliser ctypes pour y accéder:

#!/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 __== "__main__":
    print monotonic_time()
72
Armin Ronacher

Maintenant, dans Python 3.3, vous utiliseriez time.monotonic .

31
Paddy3118

Comme indiqué dans cette question , éviter NTP les ajustements sous Linux nécessite CLOCK_MONOTONIC_RAW. C'est défini comme 4 sur Linux (depuis 2.6.28).

Obtenir de manière portable la constante correcte # définie dans un en-tête C à partir de Python est délicat; il y a h2py, mais cela ne vous aide pas vraiment à obtenir la valeur au moment de l'exécution.

9
Daira Hopwood

Voici comment j'obtiens du temps monotone dans Python 2.7:

Installez le package monotonic:

pip install monotonic

Puis en 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.
3
Luke

time.monotonic() pourrait être utile:

Renvoie la valeur (en fractions de secondes) d’une horloge monotone, c’est-à-dire une horloge ne pouvant pas revenir en arrière L'horloge n'est pas affectée par les mises à jour de l'horloge système. Le point de référence de la valeur renvoyée est indéfini, de sorte que seule la différence entre les résultats d'appels consécutifs est valide.

0
AmirHossein