Frage

Beim Testen Pythons time.clock () Funktion auf FreeBSD ich bemerkt habe es immer den gleichen Wert zurückgibt, um 0,156

Die time.time () Funktion funktioniert aber ich brauche ein etwas mit einer etwas höheren Auflösung.

Hat jemand die C-Funktion es ist gebunden, und wenn es eine Alternative hochauflösende Timer?

Ich bin Profilierungs nicht so das timeit Modul hier nicht wirklich geeignet ist.

War es hilfreich?

Lösung

time.clock () gibt die Prozessorzeit. Das heißt, wie viel Zeit der aktuelle Prozess auf dem Prozessor verwendet hat. Also, wenn Sie ein Python-Skript namens „clock.py“, die es in der Tat über genau funktioniert import time;print time.clock() druckt das gleiche jedes Mal, wenn Sie es laufen, als ein neuer Prozess jedes Mal gestartet wird.

Hier ist ein Python-Konsole Protokoll, das es Ihnen erklären könnte:

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

Ich hoffe, das klärt die Dinge.

Andere Tipps

Pythons time.clock ruft C-Funktion Uhr (3) - man clock sollte bestätigen, dass es angenommen hat, auf BSD zu arbeiten, so dass ich weiß nicht, warum es nicht für Sie arbeiten. Vielleicht können Sie versuchen, um diese offensichtlichen Fehler in Ihrem Python-Port arbeiten durch ctypes mit der Uhr-Funktion aus der C-Bibliothek direkt anrufen (wenn Sie Bibliothek gesagt haben, als ein .so / .dynlib / DLL oder was auch immer dynamische gemeinsam genutzten Bibliotheken genannt werden auf FreeBSD)?

time.time sollte eine sehr hohe Auflösung sein, BTW, wie intern nennt es gettimeofday (na ja, in einem richtig gebaut Python, sowieso?) - Welche Auflösung beobachten Sie es auf Ihrem System

Bearbeiten : hier ist wat.c, eine BSD-spezifische Erweiterung (getestet auf meinem Mac nur - sorry aber ich habe keinen anderen BSD Geschmack bei der Hand rechts wissen), um dieses offensichtlich FreeBSD-Port Problem zu umgehen:

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

Und hier ist der setup.py im gleichen Verzeichnis zu setzen:

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

Die URL ist richtig, so können Sie auch diese beiden Dateien gezippt hier .

Mit dieser Erweiterung zu bauen und zu installieren, python setup.py install (wenn Sie die Berechtigung in Ihrer Python-Installation zu schreiben) oder python setup.py build_ext -i im sehr Verzeichnis schreiben wat.so, in dem Sie die Quellen setzen (und dann von Hand zu bewegen, wo immer Sie es vorziehen, haben, aber es zunächst zB mit python -c'import wat; print repr(wat.time())' im gleichen Verzeichnis ausprobieren, in dem Sie es gebaut haben).

Bitte lassen Sie mich wissen, wie es auf FreeBSD (oder jedes andere Unix-Geschmack mit gettimeofday! -) - funktioniert, wenn der C-Compiler über gettimeofday beschwert sich, Sie auf einem System sein kann, die nicht wollen, ihr zweites Argument, um zu sehen, versuchen, ohne es -).

time.clock() gibt CPU-Zeit auf UNIX-Systemen und Wanduhr Zeit seit Programmstart unter Windows. Dies ist eine sehr unglückliche insymmetry, meiner Meinung nach.

Sie können die Definition für time.time() in der Python Quellen finden hier (Link zu Google Code Search). Es scheint, die höchstauflösende Timer zur Verfügung zu verwenden, die nach einem schnellen googeln auf FreeBSD und ist gettimeofday(), und das sollte in der Mikrosekunde Genauigkeitsklasse sein.

Wenn Sie jedoch wirklich mehr Genauigkeit benötigen, könnten Sie Ihre eigene C-Modul für wirklich hochauflösendes Timing Blick in schriftlicher Form (etwas, das nur die aktuelle Mikrosekunde Zahl zurückkehren könnte, vielleicht!). Pyrex macht Python-Erweiterung sehr leicht zu schreiben und SWIG ist die andere gemeinsame Wahl. (Obwohl wirklich, wenn man so viele Mikrosekunden von Ihrer Timer Genauigkeit rasieren will, schreiben Sie einfach es als reine C Python-Erweiterung selbst.) Ctypes ist auch eine Option, aber wahrscheinlich eher langsam.

Viel Glück!

time.clock () implementiert einen doppelten Wert zurück aus

 ((double)clock()) / CLOCKS_PER_SEC

Warum denken Sie time.time () schlechte Auflösung hat? Es verwendet gettimeofday, was wiederum die Hardware-Uhr liest, die eine sehr gute Auflösung hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top