Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

time.sleep() versus pygame.time.delay()

0 votes

Salut, j'envoie des posts toutes les 10 millisecondes sur un serveur et manifestement time.sleep est moins précis que pygame.time.delay. Savez vous pourquoi ? il y a-t-il quelque chose de précis à ce niveau dans la bibliothèque standard python3.5 ?

import pygame
import time

while True:
        print(time.time())
        #time.sleep(0.01)
        pygame.time.delay(10)

résultat pygame.time.delay()

1488798582.5063686
1488798582.516369
1488798582.5263758
1488798582.5363703
1488798582.5463688
1488798582.5563776
1488798582.5663705
1488798582.5763693
1488798582.5863757
1488798582.5963705
1488798582.6063685
1488798582.6163764
1488798582.6263704
1488798582.636373
1488798582.6463847
1488798582.6563709
1488798582.6663685
1488798582.6763804
1488798582.6863706
1488798582.6963685
1488798582.7063818
1488798582.7163706
1488798582.726369
1488798582.7363753
1488798582.7463708
1488798582.75637
1488798582.7663753
1488798582.7763703
1488798582.78637
1488798582.796376
1488798582.8063703
1488798582.8163688
1488798582.826372
1488798582.8363705
1488798582.846369
1488798582.8563697
1488798582.8663707
1488798582.8763692
1488798582.8863697
1488798582.8963702

resultat time.sleep()

1488798760.6154854
1488798760.6256707
1488798760.6359868
1488798760.646193
1488798760.6564183
1488798760.6666317
1488798760.6768253
1488798760.687038
1488798760.6973004
1488798760.7074835
1488798760.7176826
1488798760.7279177
1488798760.7380855
1488798760.748314
1488798760.7585456
1488798760.7687294
1488798760.7789028
1488798760.7892337
1488798760.7993693
1488798760.809498
1488798760.819612
1488798760.829771
1488798760.839906
1488798760.8500264
1488798760.8601768
1488798760.870341
1488798760.8804677
1488798760.8905938
1488798760.900816
1488798760.9110134
1488798760.9212315
1488798760.9314017
1488798760.9416852
1488798760.9518642
1488798760.9620922
1488798760.9724424
1488798760.982589
1488798760.9927971
1488798761.0031443
1488798761.0132935
1488798761.0235207
1488798761.0338514
1488798761.0440497
1488798761.0542145
1488798761.0644462

demandé 3-Mar par LoLo972 (268 points)
edité 6-Mar par LoLo972

Peux-tu donner un benchmark ?

Sous quel OS exact tournes tu ? A priori, il devrait suffire de regarder dans les sources des deux fonctions pour comprendre.

2 Réponses

0 votes

time.sleep n'est pas extraordinaire en matière de précision. Il fait son job, mais parfois tu peux tomber sur des cas bizarres. Comme le dit la doc :

(...) Also, the suspension time may be longer than requested by an arbitrary amount because of the scheduling of other activity in the system.

Je n'ai pas trouvé de substitut rapide, tu verras sur des forums l'utilisation de select.select mais c'est ce qui est utilisé par time.sleep au final, en tout cas sur les systèmes Posix.

Pour la petite histoire, j'utilise aussi des sleep(0.01) dans un programme et un client s'est plaint que lorsqu'il le lance via Eclipse sur macOS, après une dizaine de sleep ça partait en vrille méchamment. Par contre, sur GNU/Linux et Windows, tout roule nickel. Tu peux voir que d'autres ont aussi ce soucis.

Donc les résultats peuvent varier selon la précision du mécanisme qui implémente sleep, différent sur chaque OS, les modules du noyau, etc..

répondu 7-Mar par Tiger-222 (404 points)

oui, dans la doc de pygame il disent que pygame.time.delay travaille directement avec le cpu, mais je n'ai pas assez de recule 'noyau linux' pour comprendre vraiment ce que cela implique. je pense que c'est au niveau des prio, time.sleep n'a pas la priori, il faurdiat tester en lui mettant la prio en dessous de zero pour voir. mais sinon essaie pygame.time.delay, c'est super précis.

0 votes

En matière de sleep, il y a plusieurs problèmes possibles :

  • Quelle est sa précision (on parle de granularité du temps) : ça va dépendre de l'OS, et de la fonction système utilisée. Je suppose que CPython fait un bon travail dans ce domaine (le bon choix de fonction par rapport à l'OS, etc.).
  • Même si la précision est très bonne, mettre un process en sommeil va nécessairement faire passer le thread en arrière-plan, et le réveil du process ne te donne pas la garantie qu'il va être préempté immédiatement, cela va dépendre du scheduler de l'OS qui peut introduire un certain délai.

L’implémentation de pygame est particulière : elle met en sommeil pour un temps inférieur au temps de sleep, puis elle fait de l'attente active (boucle infinie le temps que le délai soit atteint) : cela améliore évidement la précision, et l'impact du scheduler est ainsi probablement annihilé. Toutefois, on ne pourra pas parler de véritable sleep pour la dernière portion de temps, vu que le processeur est actif.

répondu 10-Mar par yoch (1,904 points)
...