Comment puis-je obtenir des durées de temps monotones en python?
je veux noter combien de temps quelque chose prend en temps réel. Actuellement je fais ceci:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
mais cela échouera (produire des résultats incorrects) si le temps est ajusté pendant que la requête SQL (ou quoi que ce soit d'autre) est en cours d'exécution.
Je ne veux pas juste le comparer. Je veux ouvrir une session dans une application en direct afin de voir les tendances sur un système live.
je veux quelque chose comme clock_gettime(CLOCK_MONOTONIC,...), mais dans Python. Et de préférence sans avoir à écrire un module C qui appelle clock_gettime().
5 réponses
cette fonction est assez simple pour que vous puissiez utiliser les 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 __name__ == "__main__":
print monotonic_time()
comme indiqué dans cette question , éviter les réajustements NTP sur Linux nécessite CLOCK_MONOTONIC_RAW. C'est défini comme 4 sur Linux (depuis 2.6.28).
obtenir la constante correcte #définie dans un en-tête C de Python est délicat; il y a h2py, mais cela ne vous aide pas vraiment à obtenir la valeur à l'exécution.
Voici comment j'obtiens le temps monotone en Python 2.7:
installer le paquet 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.
time.monotonic()
pourrait être utile:
renvoie la valeur (en fraction de seconde) d'une horloge monotone, c'est-à-dire une horloge qui ne peut pas revenir en arrière. L'horloge n'est pas affectée par les mises à jour de l'horloge du système. Le point de référence de la valeur retournée n'est pas défini, de sorte que seule la différence entre les résultats des appels consécutifs est valide.