Question

Je veux enregistrer combien de temps dure quelque chose en temps réel. Actuellement, je fais ceci:

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 que la requête SQL (ou quoi que ce soit) est en cours d'exécution.

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

Était-ce utile?

La solution

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 __name__ == "__main__":
    print monotonic_time()

Autres conseils

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

Comme indiqué dans la cette question , en évitant NTP les réajustements sous Linux nécessitent CLOCK_MONOTONIC_RAW. Cela correspond à 4 sous Linux (depuis la 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.

Voici comment obtenir du temps monotone dans Python 2.7:

Installez le package monotonique :

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 quelques 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top