Pregunta

Mientras que la función de prueba en FreeBSD pitones time.Clock () Me he dado cuenta de que siempre devuelve el mismo valor, alrededor de 0,156

La función time.time () funciona correctamente, pero necesito un algo con una resolución ligeramente superior.

¿Alguien la función C es obligado a y si hay un temporizador de alta resolución alternativa?

No estoy perfilado por lo que el módulo de TimeIt no es muy apropiado en este caso.

¿Fue útil?

Solución

time.Clock () devuelve el tiempo de procesador. Es decir, la cantidad de tiempo que el proceso actual se ha utilizado en el procesador. Así que si usted tiene un script Python llamada "clock.py", que no import time;print time.clock() que de hecho se imprimirá sobre exactamente lo mismo cada vez que se ejecuta, como un nuevo proceso que se inicia cada vez.

Aquí hay un registro de la consola Python que podrían explicar a usted:

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

Espero que esto aclare las cosas.

Otros consejos

time.Clock de Python llama a la función de reloj C (3) - man clock debe confirmar que se supone que funciona en BSD, así que no sé por qué no está trabajando para usted. Tal vez usted puede intentar solucionar este aparente error en el puerto de Python usando ctypes para llamar a la función de reloj de la librería C del sistema directamente (si ha dicho biblioteca como un .so / .dynlib / .dll o lo que sea bibliotecas compartidas dinámicas son llamados en FreeBSD)?

time.time se supone que es una resolución muy alta, por cierto, ya que internamente se llama gettimeofday (bueno, en un pitón adecuadamente construida, de todos modos) - lo que la resolución Qué se observa por ella en su sistema

Editar : aquí está wat.c, una extensión de BSD específica (probado en mi Mac solamente - lo siento, pero no tengo otro sabor BSD a la mano derecha sepa) para evitar este problema aparente port de 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);
}

Y aquí está la setup.py a poner en el mismo directorio:

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'])],
)

El URL es correcta, por lo que también puede obtener estos dos archivos comprimidos subiendo aquí .

Para construir e instalar esta extensión, python setup.py install (si tiene permiso para escribir en su instalación de Python) o python setup.py build_ext -i escribir wat.so en el mismo directorio en el que se pone las fuentes (y luego mover manualmente a donde quiera que prefiere lo tiene, pero primero hay que probarlo por ejemplo, con python -c'import wat; print repr(wat.time())' en el mismo directorio en el que se ha construido él).

Por favor, hágamelo saber cómo funciona en FreeBSD (o cualquier otro sabor Unix con gettimeofday -) - si el compilador de C se queja de gettimeofday, es posible que en un sistema que no quiere ver a su segundo argumento, tratar sin ella -.)

time.clock() devuelve el tiempo de CPU en sistemas UNIX, y el tiempo wallclock desde el inicio del programa en Windows. Se trata de un insymmetry muy lamentable, en mi opinión.

Puede encontrar la definición para time.time() en las fuentes de Python aquí (enlace a Google Code Search). Parece utilizar el temporizador de resolución más alta disponible, que según un googlear rápida se gettimeofday() en FreeBSD así, y que debe estar en la clase de precisión de microsegundos.

Sin embargo, si realmente se necesita más precisión, se puede mirar en la escritura de su propio módulo C de muy alta resolución de tiempo (algo que sólo podría retornar el número de microsegundos actual, tal vez!). Pyrex hace extensión de Python escribir muy fácil, y TRAGO es la otra opción común. (Aunque en realidad, si usted quiere afeitarse la mayor cantidad de microsegundos fuera de su exactitud temporizador, acaba de escribir como una pura extensión C Python sí mismo.) Ctypes es también una opción, pero probablemente bastante lento.

Mucha suerte!

time.Clock () está implementado para devolver un valor doble resultante de

 ((double)clock()) / CLOCKS_PER_SEC

¿Por qué cree time.time () tiene mala resolución? Utiliza gettimeofday, que a su vez lee el reloj interno del ordenador, que tiene muy buena resolución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top