2013-05-15 12 views
7

Jeśli mam listę L:Jak mogę spowolnić pętlę w Pythonie?

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Czy istnieje sposób, aby kontrolować następujące dla pętli tak, że następny element listy jest drukowana tylko jedną sekundę po poprzednim?

for i in l: 
    print i 

Innymi słowy, czy istnieje sposób na eleganckie spowolnienie pętli w Pythonie?

+9

to f Unny, większość ludzi chce wiedzieć, jak _speed up_ ich pętli! –

+1

Uważam, że uruchamianie go na moim starym Treo 300 jest dobrym sposobem na zwolnienie pętli ... – abarnert

+0

Co ważniejsze, jeśli próbujesz obejrzeć, co się dzieje, możesz spróbować uruchomić program debuggera lub interaktywnego wizualizatora, zamiast po prostu rzucać w siebie wezwania "uśpienia". – abarnert

Odpowiedz

13

Można użyć time.sleep

import time 

for i in l: 
    print i 
    time.sleep(1) 
5

Można wstrzymać wykonanie kodu przy użyciu time.sleep:

import time 

for i in l: 
    print(i) 
    time.sleep(1) 
9

Jeśli używasz time.sleep(1), swoje pętle potrwa nieco ponad sekundę od pętli i drukowania zajmuje również trochę czasu. Lepszym sposobem jest spać przez resztę sekundy. Można obliczyć, że za pomocą -time.time()%1

>>> import time 
>>> L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> for i in L: 
...  time.sleep(-time.time()%1) 
...  print i 
... 

Łatwo zaobserwować za pomocą print i, repr(time.time())

>>> for i in L: 
...  time.sleep(-time.time()%1) 
...  print i, repr(time.time()) 
... 
0 1368580358.000628 
1 1368580359.001082 
2 1368580360.001083 
3 1368580361.001095 
4 1368580362.001149 
5 1368580363.001085 
6 1368580364.001089 
7 1368580365.001086 
8 1368580366.001086 
9 1368580367.001085 

vs

>>> for i in L: 
...  time.sleep(1) 
...  print i, repr(time.time()) 
... 
0 1368580334.104903 
1 1368580335.106048 
2 1368580336.106716 
3 1368580337.107863 
4 1368580338.109007 
5 1368580339.110152 
6 1368580340.111301 
7 1368580341.112447 
8 1368580342.113591 
9 1368580343.114737 
+2

Oprócz tego, że wymusza to wyrównanie na dokładnym drugim znaku, zakłada to również, że koszt 'time.time' i' time.sleep' jest nieistotny, ale czas 'print' jest znaczący i że' sleep' jest dokładne do odpowiedniej skali, które są mało prawdopodobne, aby były prawdziwe na większości platform ... – abarnert

+0

@abarnert, czas spowodowany 'time.time()' i 'time.sleep()' nie ma znaczenia tak długo, jak to jest dość zgodny. 'sleep()' i tak nie oferuje gwarancji dokładnego czasu. –

+0

Druga część twojego komentarza to główny punkt. "sen" nie jest dokładny ani dokładny, bez względu na to, co robisz. Z łatwością może przespać następny znak '.000', co oznacza, że ​​twój kod straci całą sekundę, podczas gdy" głupi "kod po prostu straci 50us. Czy to naprawdę ulepszenie? Potrzebujesz bardziej skomplikowanej logiki (zasadniczo, śledź czas spania _until_, abyś mógł poprawić zaspanie), aby faktycznie to zrobić. Jest bardzo mało sytuacji, w których 'sleep (1)' nie jest wystarczająco dobry, ale 'snu (-time.time()% 1)' jest. – abarnert

-4

Korzystając time.sleep(number):

for i in range(i) 
print(1) 
time.sleep(0.05) 
+3

Necro-posting jest w porządku, jeśli przynosi jakąś dodatkową wartość, ale ta odpowiedź nie przynosi takiego światła w tej sprawie: kod nawet nie działa. – trincot

Powiązane problemy