Question

Lors du test Pythons fonction time.clock () sur FreeBSD, je l'ai remarqué retourne toujours la même valeur, autour de 0,156

La fonction time.time () fonctionne correctement, mais je besoin d'un quelque chose avec une résolution légèrement plus élevé.

Quelqu'un la fonction C, il est lié à et s'il y a une minuterie haute résolution alternative?

Je ne suis pas le profilage de sorte que le module timeit n'est pas vraiment approprié ici.

Était-ce utile?

La solution

renvoie le temps processeur time.clock (). Autrement dit, combien de temps le processus en cours est utilisé sur le processeur. Donc, si vous avez un script Python appelé « clock.py », qui ne import time;print time.clock() il fait imprimer sur exactement le même à chaque fois que vous exécutez, comme un nouveau processus est lancé à chaque fois.

Voici un journal de la console python qui pourrait vous l'expliquer:

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

J'espère que cela clarifie les choses.

Autres conseils

appelle la time.clock Python horloge fonction C (3) - man clock devrait confirmer qu'il est censé fonctionner sur BSD, donc je ne sais pas pourquoi cela ne fonctionne pas pour vous. Peut-être vous pouvez essayer de travailler autour de ce bogue apparent dans votre port Python en utilisant ctypes pour appeler la fonction d'horloge de la bibliothèque système C directement (si vous avez dit la bibliothèque en tant que .donc / .dynlib / .dll ou quoi que bibliothèques partagées dynamiques sont appelés sur FreeBSD)?

time.time est censé être très haute résolution, d'ailleurs, en interne, il appelle gettimeofday (bien, dans un Python, de toute façon bien construit) - quelle résolution observez-vous pour cela sur votre système

Modifier : voici wat.c, une extension spécifique à BSD (testé sur mon Mac uniquement - désolé mais je n'ai pas d'autre saveur BSD à portée de main savent droite) pour contourner ce problème de port FreeBSD apparent:

#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);
}

Et voici le setup.py à mettre dans le même répertoire:

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 est correcte, donc vous pouvez également obtenir ces deux fichiers compressés jusqu'à ici .

Pour construire et installer cette extension, python setup.py install (si vous avez la permission d'écrire dans votre installation de Python) ou python setup.py build_ext -i écrire wat.so dans le répertoire même où vous mettez les sources (puis déplacer manuellement chaque fois que vous préférez ont, mais d'abord l'essayer par exemple avec python -c'import wat; print repr(wat.time())' dans le même répertoire dans lequel vous avez construit il).

S'il vous plaît laissez-moi savoir comment il fonctionne sur FreeBSD (ou tout autre saveur Unix avec gettimeofday -) - si le compilateur C se plaint de gettimeofday, vous pouvez être sur un système qui ne veut pas voir son deuxième argument, essayez sans elle -.)

time.clock() retourne temps CPU sur les systèmes UNIX, et le temps de wallclock depuis le début du programme sous Windows. Ceci est un insymmetry très malheureux, à mon avis.

Vous pouvez trouver la définition de time.time() dans les sources Python ici (lien vers Google Recherche de code). Il semble utiliser la minuterie la plus haute résolution disponible, qui, selon une recherche sur Google est rapide gettimeofday() sur FreeBSD aussi bien, et qui devrait être dans la classe de précision de la microseconde.

Toutefois, si vous avez vraiment besoin de plus de précision, vous pouvez envisager d'écrire votre propre module C pour vraiment temps à haute résolution (quelque chose qui pourrait bien retourner le compte courant de microseconde, peut-être!). Pyrex fait l'extension Python écriture très facile, et SWIG est l'autre choix commun. (Bien que vraiment, si vous voulez raser autant microsecondes votre précision de la minuterie, il suffit d'écrire comme une extension C pure Python vous.) Ctypes est également une option, mais probablement plutôt lent.

Bonne chance!

time.clock () est mise en oeuvre pour renvoyer une double valeur résultant de

 ((double)clock()) / CLOCKS_PER_SEC

Pourquoi pensez-vous time.time () a une mauvaise résolution? Il utilise gettimeofday, qui à son tour lit l'horloge matérielle, qui a une très bonne résolution.

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