57 votes

Comment obtenir des durées monotoniques en python?

Je veux ouvrir une session combien de temps cela prend dans la vraie walltime. Actuellement, je fais ceci:

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

Mais ce sera un échec (produire des résultats incorrects) si l'heure est réglée pendant que la requête SQL (ou quoi que ce soit) est en cours d'exécution.

Je ne veux pas simplement référence à elle. 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 en Python. Et de préférence sans avoir à écrire un module C qui appelle clock_gettime().

82voto

Armin Ronacher Points 16894

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

44voto

Paddy3118 Points 1770

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

9voto

Daira Hopwood Points 687

Comme indiqué dans cette question , éviter les réajustements NTP 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X