Domanda

Durante il test Pitoni time.clock () funzione FreeBSD ho notato che restituisce sempre lo stesso valore, in tutto 0.156

La funzione time.time () funziona correttamente, ma ho bisogno di un qualcosa con una risoluzione leggermente superiore.

C'è qualcuno che la funzione C è destinato a, e se non v'è un timer ad alta risoluzione alternativa?

Non sto profiling così il modulo timeit non è davvero appropriato qui.

È stato utile?

Soluzione

time.clock () restituisce il tempo del processore. Cioè, quanto tempo il processo corrente ha usato sul processore. Quindi, se si dispone di uno script Python chiamato "clock.py", che non import time;print time.clock() esso sarà infatti stampare circa esattamente lo stesso ogni volta che lo si esegue, come un nuovo processo viene avviato ogni volta.

Ecco un log della console python che potrebbe spiegare a voi:

>>> import time
>>> time.clock()
0.11
>>> time.clock()
0.11
>>> time.clock()
0.11
>>> for x in xrange(100000000): pass
... 
>>> time.clock()
7.7800000000000002
>>> time.clock()
7.7800000000000002
>>> time.clock()
7.7800000000000002

Spero che questo chiarisce le cose.

Altri suggerimenti

time.clock di Python chiama C funzione orologio (3) - man clock dovrebbe confermare che si suppone di lavorare su BSD, quindi non so perché non funziona per voi. Forse si può provare a lavorare attorno a questo apparente bug nel porto Python utilizzando ctypes di chiamare la funzione orologio dalla libreria C di sistema direttamente (se avete detto libreria come .so / / dll o qualsiasi altra cosa le librerie condivise dinamiche sono chiamati .dynlib su FreeBSD)?

time.time si suppone che sia molto alta risoluzione, BTW, come internamente chiama gettimeofday (beh, in un Python correttamente costruita, comunque) -? Quale risoluzione si osserva per esso sul sistema

Modifica : ecco wat.c, un'estensione specifica-BSD (testato sul mio Mac solo - mi dispiace ma non ho altro sapore BSD alla destra sa) per ovviare a questo evidente problema port di FreeBSD:

#include "Python.h"
#include <sys/time.h>

static PyObject *
wat_time(PyObject *self, PyObject *args)
{
    struct timeval t;
    if (gettimeofday(&t, (struct timezone *)NULL) == 0) {
        double result = (double)t.tv_sec + t.tv_usec*0.000001;
        return PyFloat_FromDouble(result);
    }
    return PyErr_SetFromErrno(PyExc_OSError);
}

static PyMethodDef wat_methods[] = {
      {"time",      wat_time,       METH_VARARGS,
       PyDoc_STR("time() -> microseconds since epoch")},
      {NULL,        NULL}       /* sentinel */
};

PyDoc_STRVAR(wat_module_doc,
"Workaround for time.time issues on FreeBsd.");

PyMODINIT_FUNC
initwat(void)
{
    Py_InitModule3("wat", wat_methods, wat_module_doc);
}

Ed ecco il setup.py di mettere nella stessa directory:

from distutils.core import setup, Extension

setup (name = "wat",
       version = "0.1",
       maintainer = "Alex Martelli",
       maintainer_email = "aleaxit@gmail.com",
       url = "http://www.aleax.it/wat.zip",
       description = "WorkAround for Time in FreeBSD",
       ext_modules = [Extension('wat', sources=['wat.c'])],
)

L'URL è corretto, in modo da poter anche ottenere questi due file compressi fino qui .

Per costruire e installare questa estensione, python setup.py install (se avete il permesso di scrivere nella tua installazione di Python) o python setup.py build_ext -i scrivere wat.so in pieno directory in cui si mettono le fonti (e quindi spostare manualmente ovunque si preferisce ce l'ha, ma prima provarlo esempio con python -c'import wat; print repr(wat.time())' nella stessa directory in cui è stato compilato il tutto).

Per favore fatemi sapere come funziona su FreeBSD (o qualsiasi altro sapore Unix con gettimeofday -!) - se il compilatore C lamenta gettimeofday, si può essere in un sistema che non vuole vedere il suo secondo argomento, provare senza di essa -!).

time.clock() ritorna tempo di CPU sui sistemi UNIX, e il tempo wallclock da inizio programma su Windows. Questo è un molto sfortunato insymmetry, a mio parere.

È possibile trovare la definizione per time.time() nelle fonti Python qui (link a Google Code Search). Sembra di utilizzare il timer più alta risoluzione disponibile, che in base ad una rapida Googling è gettimeofday() su FreeBSD pure, e che dovrebbe essere nella classe di precisione microsecondo.

Tuttavia, se si ha realmente bisogno di una maggiore precisione, si poteva guardare a scrivere il proprio modulo C per tempi davvero ad alta risoluzione (qualcosa che potrebbe semplicemente restituire il conteggio microsecondo corrente, forse!). Pyrex rende estensione Python scrittura molto sforzo, e SWIG è l'altra scelta comune. (Anche se in realtà, se si vuole radere il maggior numero di microsecondi fuori la vostra precisione timer, basta scrivere come un puro C Python estensione da soli.) Ctypes è anche un'opzione, ma probabilmente piuttosto lento.

Buona fortuna!

time.clock () è implementato per restituire un doppio valore risultante dalla

 ((double)clock()) / CLOCKS_PER_SEC

Perché pensi che time.time () ha cattivo risoluzione? Esso utilizza gettimeofday, che a sua volta si legge l'orologio hardware, che ha molto buona risoluzione.

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