Ungenaue Zeit.Sleep () mit Python 3.x und Windows 7

Nach diesem Beitrag habe ich eine nicht funktionale Implementierung von Pythons time.sleep () -Funktion unter Windows 7 (Enterprise, 64-Bit und Python 3.4.4) identifiziert.

Hier ist die Referenz. Py Skript:

  • Wie suche ich eine Liste von Tupeln in Python
  • UnicodeDecodeError mit Djangos Anfrage.FILES
  • Update django Datenbank, um Änderungen in bestehenden Modellen widerzuspiegeln
  • Installieren von Django mit Pip
  • Wie erkennt man, ob ein Prozess mit Python auf Win und MAC läuft
  • Django Admin Media Präfix URL Problem
  • import threading, time def Return(): return def Setup(): for _ in range(10): time_before = time.time() Return() wait_delay = -time.time() delays = [] InputFrequency = 60 while (time.time() - time_before) < (1 / InputFrequency): time.sleep(0) wait_delay += time.time() delays.append(wait_delay) print("Output frequency: " + str([1/t for t in delays][0]) + " Hz") threading.Thread(target=Setup).start() 

    Wie in diesem Beispiel sollte dieses Skript Ausgangsfrequenzen von etwa 60 Hz erzeugen. Allerdings, wenn auf meinem Windows 7 Enterprise-Maschine laufen, sind dies die Ausgänge Frequenzen, die ich für eine gegebene Eingangsfrequenz erhalten:

    Eingang: 10Hz – Ausgang: 9.15Hz


    Eingang: 20Hz – Ausgang: 16.03Hz


    Eingang: 30Hz – Ausgang 21.37Hz


    Eingangsbereich: 40Hz – 64Hz – Ausgang: 32.05Hz


    Eingangsbereich: 65Hz – 10kHz + – Ausgang: 64.10Hz


    Was geht hier vor sich? Warum sind unterschiedliche Eingangsfrequenzen (über 40Hz), die die gleiche Ausgangsfrequenz erzeugen? Warum ist die Ausgangsfrequenz obere Grenze 64.10Hz, auch wenn die Eingangsfrequenz über 10.000Hz liegt? Ich glaube nicht, dass es eine Zeit ist. Schlaf () Auflösung Problem bei ~ 60Hz. Die gleichen Eingangsfrequenz-Werte, die dem ideone.com-Skript zugeführt werden, erzeugen die erwarteten Ausgangsfrequenzen, so dass es mit meinem Computer verwandt sein muss.

  • Python 3 und matplotlib lissue auf Linux
  • Auspacken von Tupeln / Arrays / Listen als Indizes für Numpy Arrays
  • Python repr für Klassen
  • Erstellen Sie eine Zeile des Datums beim Erstellen von Superuser
  • Leichte Hex / Float-Umwandlung
  • OpenCV findChessboardCorners Funktion scheitert in einem (scheinbar) einfachen Szenario
  • 2 Solutions collect form web for “Ungenaue Zeit.Sleep () mit Python 3.x und Windows 7”

    Python macht nur wenige Garantien darüber, wie sich diese Anrufe verhalten werden, vor allem Cross-Plattform. Es gibt zwei Dinge, die hier möglicherweise schief gehen können – time.time() 's Auflösung ist schlimmer als die Auflösung, die du versucht hast zu erreichen oder sleep ' s Auflösung ist.

    Der Schlaf sollte etwa 1 bis 2 ms genau auf den letzten Plattformen liegen, wie hier berichtet:

    Wie genau ist python's time.sleep ()?

    Das verlässt time.time() . Die Dokumentation für diesen besonderen Aufruf warnt die Genauigkeit kann schlecht sein:

    Beachten Sie, dass, obwohl die Zeit immer als Gleitkommazahl zurückgegeben wird, nicht alle Systeme Zeit mit einer besseren Genauigkeit als 1 Sekunde liefern. Während diese Funktion normalerweise nicht abnehmende Werte zurückgibt, kann sie einen niedrigeren Wert als einen vorherigen Anruf zurückgeben, wenn die Systemuhr zwischen den beiden Anrufen zurückgesetzt wurde.

    Glücklicherweise wird eine time.perf_counter() höherer Auflösung in time.perf_counter() die versucht, auf die auf der Plattform verfügbare Uhr mit der höchsten Auflösung zuzugreifen. Aus der Dokumentation:

    Geben Sie den Wert (in Sekundenschnelle) eines Leistungszählers zurück, dh eine Uhr mit der höchsten verfügbaren Auflösung, um eine kurze Dauer zu messen. Es beinhaltet die Zeit, die während des Schlafes vergangen ist und ist systemweit. Der Referenzpunkt des zurückgegebenen Wertes ist undefiniert, so dass nur die Differenz zwischen den Ergebnissen aufeinanderfolgender Anrufe gültig ist.

    Im Falle von Windows scheint dies besser als 60Hz zu sein, was dein Problem korrigiert.

     while (time.time() - time_before) < (1 / InputFrequency): time.sleep(0) 

    Versuchen Sie, den sleep(0) mit pass ersetzen, oder sogar Return() .

    Python ist die beste Programmiersprache der Welt.