Domanda

Voglio registrare quanto tempo impiega un vero walltime. Attualmente sto facendo questo:

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

Ma ciò fallirà (produrrà risultati errati) se il tempo viene regolato mentre la query SQL (o qualunque cosa sia) è in esecuzione.

Non voglio solo fare un benchmark. Voglio registrarlo in un'applicazione live per vedere le tendenze su un sistema live.

Voglio qualcosa come clock_gettime (CLOCK_MONOTONIC, ...), ma in Python. E preferibilmente senza dover scrivere un modulo C che chiama clock_gettime ().

È stato utile?

Soluzione

Questa funzione è abbastanza semplice da poter usare i tipi per accedervi:

#!/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()

Altri suggerimenti

Ora, in Python 3.3 useresti time.monotonic .

Come sottolineato in questa domanda , evitando NTP riaggiustamenti su Linux richiedono CLOCK_MONOTONIC_RAW. Questo è definito come 4 su Linux (dal 2.6.28).

Ottenere in modo portabile la costante corretta #defined in un'intestazione C da Python è difficile; c'è h2py, ma ciò non ti aiuta davvero a ottenere il valore in fase di esecuzione.

Ecco come ottengo il tempo monotonico in Python 2.7:

Installa il pacchetto monotonic :

pip install monotonic

Quindi in 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 () potrebbe essere utile:

  

Restituisce il valore (in secondi frazionari) di un orologio monotonico, ovvero un orologio che non può tornare indietro. L'orologio non è interessato dagli aggiornamenti dell'orologio di sistema. Il punto di riferimento del valore restituito non è definito, pertanto è valida solo la differenza tra i risultati delle chiamate consecutive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top