Quelle est la précision du python du temps.sleep()?
Je peux donner des nombres à virgule flottante, comme
time.sleep(0.5)
mais quelle est la précision? Si je vous le donne
time.sleep(0.05)
va vraiment dormir environ 50 ms?
Vous devez vous connecter pour publier un commentaire.
La précision de l'heure.fonction de sommeil dépend de votre OS sous-jacent de sommeil précision. Pour les non-OS temps réel est comme un stock de Windows le plus petit intervalle, vous pouvez dormir pendant environ 10-13ms. J'ai vu précis dort dans plusieurs millisecondes de temps quand au-dessus du minimum de 10 13ms.
Mise à jour:
Comme mentionné dans les documents cités ci-dessous, il est commun de faire de la veille dans une boucle qui fera en sorte d'aller de nouveau au sommeil si elle vous réveille tôt.
Je dois aussi mentionner que si vous utilisez Ubuntu, vous pouvez essayer un pseudo-noyau temps-réel (avec le RT_PREEMPT jeu de patch) par l'installation de la rt paquet de noyau (au moins dans Ubuntu 10.04 LTS).
EDIT: Correction de la non-temps réel noyaux Linux ont un minimum de sommeil intervalle beaucoup plus proche de 1ms puis 10ms, mais il varie dans un non-déterministe manière.
sleep()
de la docs "la période de suspension peut être plus longue que ce qui est demandé par une quantité arbitraire à cause de la tenue d'une autre activité dans le système".Les gens sont tout à fait raison sur les différences entre les systèmes d'exploitation et des noyaux, mais je ne vois pas de granularité dans Ubuntu, et je vois un 1 ms granularité dans MS7. Ce qui suggère une mise en œuvre différente de temps.sommeil, pas juste une autre tique taux. Une inspection plus minutieuse suggère un 1µs granularité dans Ubuntu par le sens, mais qui est due à la fois.le temps de la fonction que j'utilise pour la mesure de la précision.
timeit.default_timer
à la place?time.sleep()
utilise millisecondes sur Windows, ce qui explique l'absence de sous-ordre de la milliseconde dort.De la la documentation:
Et plus précisément w.r.t.
sleep()
:Voici mon suivi de Wilbert réponse: la même chose pour Mac OS X Yosemite, puisqu'il n'est pas mentionné encore beaucoup.
Ressemble beaucoup à du temps il dort environ 1,25 fois l'heure de la demande et dort parfois entre 1 et 1,25 fois le temps de votre demande. Presque jamais (~deux fois sur 1000 échantillons) dort beaucoup plus que 1,25 fois le temps de votre demande.
Aussi (pas indiqué explicitement) de 1,25 relation semble tenir plutôt bien jusqu'à ce que vous obtenez en dessous d'environ 0,2 ms, après quoi il commence à avoir un peu floue. En outre, le temps semble s'installer à environ 5 ms de plus que vous demande après le laps de temps requis obtient au-dessus de 20 ms.
Encore une fois, il semble être un de complètement différent de la mise en œuvre de
sleep()
sous OS X que sous Windows ou n'importe quel Linux kernel Wilbert était de l'utiliser.Pourquoi ne pas vous trouver:
Pour l'enregistrement, je reçois l'ordre de 0,1 ms erreur sur mon HTPC et 2ms sur mon ordinateur portable, les deux machines linux.
Une petite correction, plusieurs personnes mentionnent que le sommeil peut être terminé au début par un signal. Dans le 3.6 docs il dit,
Vous ne pouvez pas vraiment quoi que ce soit garantie sur sleep(), sauf qu'il va au moins faire un meilleur effort de dormir aussi longtemps que vous lui avez dit (signaux peuvent tuer votre sommeil avant le temps est écoulé, et beaucoup plus de choses peuvent faire courir de long).
Pour assurer le minimum que vous pouvez obtenir sur un ordinateur de bureau standard du système d'exploitation va être autour de 16ms (minuterie de granularité plus le temps de changement de contexte), mais les chances sont que le % de l'écart à partir de l'argument fourni est importante quand vous êtes à essayer de dormir pendant 10s de millisecondes.
Signaux, les autres threads tenue de la GIL, d'ordonnancement du noyau de plaisir, un processeur de vitesse pas à pas, etc. peuvent jouer des ravages avec la durée de votre thread/processus dort.
Testé récemment sur Python 3.7 sur Windows 10. La précision a été autour de 1ms.
Ne pas utiliser une variable pour passer l'argument de sleep (), vous devez insérer le calcul directement dans le sommeil ()
Et le retour de mon terminal
1 ───── 17:20:16.891 ───────────────────
2 ───── 17:20:18.891 ───────────────────
3 ───── 17:20:20.891 ───────────────────
4 ───── 17:20:22.891 ───────────────────
5 ───── 17:20:24.891 ───────────────────
....
689 ─── 17:43:12.891 ────────────────────
690 ─── 17:43:14.890 ────────────────────
691 ─── 17:43:16.891 ────────────────────
692 ─── 17:43:18.890 ────────────────────
693 ─── 17:43:20.891 ────────────────────
...
727 ─── 17:44:28.891 ────────────────────
728 ─── 17:44:30.891 ────────────────────
729 ─── 17:44:32.891 ────────────────────
730 ─── 17:44:34.890 ────────────────────
731 ─── 17:44:36.891 ────────────────────