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().

47
demandé sur Thomas 2009-07-30 14:23:55

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()
72
répondu Armin Ronacher 2014-02-07 00:46:33

maintenant, en Python 3.3 vous utiliserez le temps .monotone .

29
répondu Paddy3118 2013-01-19 16:49:11

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.

9
répondu Daira Hopwood 2017-05-23 12:10:38

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.
3
répondu Luke 2018-01-28 21:54:27

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.

-1
répondu AmirHossein 2017-05-08 09:16:38