Python time.sleep vs ocupado esperar precisión

Estaba jugando con la función time.sleep de la biblioteca estándar de python y me pareció inadecuada para los retrasos de subms. De las pruebas encontré que esperar realmente 1.1-1.2 ms para una espera de 1 ms. Implementar una espera ocupada consiguió la precisión dentro del 1%. Solía:

def busy_wait(dt): current_time = time.time() while (time.time() < current_time+dt): pass 

y podría bajar a 0.0001 segundos antes de romper el 1% de precisión.

Las principales preguntas que tengo son:

  • ¿Por qué la función de suspensión es tan inexacta (posiblemente un problema con C)? ¿Conseguirá esto una mejor CPU con una mayor velocidad de reloj?
  • ¿Por qué alguien usaría el sueño? La única ventaja que veo, la conservación de energía, se limita a los sistemas integrados, ¿no?
  • ¿Sería viable compensar la inexactitud del sueño con la calibración? Al igual que:
 def sleep (dt):
     reposo (calibración_función (dt))

Además, leí que el sueño no funciona bien con largos tiempos de espera: ¿ Límite superior en Python time.sleep ()? También leí en alguna parte en SO para hacer un ciclo de intervalos de tiempo más cortos para boost la precisión, pero eso es inútil cuando quiero retrasar 0.01 seg. Karl Voigtland menciona el uso de ntysueño de ctypes, pero creo que esto es una exageración y que la hora de dormir debe cumplir su objective.

time.sleep es una característica de python rota? ¿O a nadie le importa lo suficiente la medición precisa del tiempo?

En Windows, la función de suspensión del sistema operativo (que Python utiliza necesariamente) solo puede activar un hilo en un múltiplo del intervalo del temporizador actual. Normalmente esto oscila entre 1,0 ms y 15,6 ms. Bajar el intervalo del temporizador puede ser útil porque permite dormir menos, pero desperdicia electricidad, como escribí en este artículo:

http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

La espera ocupada puede dar una mayor precisión, pero generalmente es una idea horrible, ya que desperdicia aún más electricidad y le roba el tiempo de CPU de tareas más meritorias:

https://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

Finalmente, la precisión de la espera ocupada dependerá de la función del temporizador que esté utilizando para obtener la hora actual, y también puede depender del intervalo del temporizador:

https://randomascii.wordpress.com/2013/05/09/timegettime-versus-gettickcount/

¿Por qué quieres dormir por períodos de tiempo tan cortos? Por lo general, sería mejor esperar a que algo suceda, esperar en un evento, en lugar de esperar por períodos de tiempo tan cortos.

Esto es una especie de pregunta duplicada, pero intentaré responderla aquí de la mejor manera posible.

La función de suspensión es una llamada del sistema operativo que se diferencia de la espera ocupada en que no bloquea el hilo. Sin embargo, si tiene una secuencia de comandos de varios subprocesos, no debería bloquear los otros subprocesos. La función de suspensión no es precisa en Windows porque no es un sistema operativo en tiempo real (no estoy seguro de lo que eso significa). Si está buscando estrictamente la precisión de la espera, la espera ocupada es el camino a seguir. De lo contrario, es probable que se prefiera time.sleep() . La razón por la que la llamada del sistema operativo a la suspensión es incorrecta es probablemente porque confía en que el sistema operativo regrese en el momento correcto, y depende de la precisión del progtwigdor del sistema operativo.