2011-01-18 15 views
6

Mam pętlę, która działa do kilku godzin na raz. jak mógłbym mi powiedzieć, ile czasu upłynęło w ustalonym czasie?python -> czas jakiś pętla działa

tylko generic ... pytanie

EDIT: to pętla while, który biegnie permutacje, więc mogę mieć go wydrukować czas pracy co 10 sekund?

Odpowiedz

8

Zamiast sprawdzania czasu na każdej pętli, można użyć obiektu Timer

import time 
from threading import Timer 

def timeout_handler(timeout=10): 
    print time.time() 
    timer = Timer(timeout, timeout_handler) 
    timer.start() 

timeout_handler() 
while True: 
    print "loop" 
    time.sleep(1) 
+1

+1 O wiele ładniej niż moja odpowiedź, uwielbiam to, że pyton zawiera takie baterie. – fmark

1

Istnieje bardzo hacky sposób to zrobić przy użyciu time.asctime(). Przechowujesz asocjat przed wejściem do pętli while i gdzieś w samej pętli. Oblicz różnicę czasu między czasem przechowywania i czasem bieżącym, a jeśli różnica wynosi 10 sekund, zaktualizuj zapisany czas do bieżącego czasu i wydrukuj, który został uruchomiony.

Jednak jest to bardzo hacky sposób, ponieważ wymaga skręconej i nudnej matematyki.

Jeśli celem jest sprawdzenie czasu pracy określonego algorytmu, to jesteś lepiej wyłączyć za pomocą modułu timeit

Hope this helps

2

Jak już wspomniano, jest to trochę bolesnego siekać , ponieważ wymaga sprawdzenia czasu każdej iteracji. Aby to zadziałało, musisz mieć zadania, które działają przez mały procent czasu oczekiwania - jeśli twoja pętla wykonuje tylko iteracje co minutę, nie będzie drukować co dziesięć sekund. Jeśli chcesz zostać przerwany, możesz rozważyć wielowątkowość, lub najlepiej, jeśli jesteś na liniach/mac/unix, sygnały. Jaka jest twoja platforma?

import time 

timeout = 10 
first_time = time.time() 
last_time = first_time 
while(True): 
    pass #do something here 
    new_time = time.time() 
    if new_time - last_time > timeout: 
     last_time = new_time 
     print "Its been %f seconds" % (new_time - first_time) 

wyjściowa:

Its been 10.016000 seconds 
Its been 20.031000 seconds 
Its been 30.047000 seconds 
+0

ohmygosh Kocham cię ale co 'pass' zrobić? czy umieściłem coś na miejscu? – tekknolagi

+1

'pass' jest operacją zerową, jest tylko symbolem zastępczym i nie robi nic ([naprawdę] (http://docs.python.org/reference/simple_stmts.html#pass)). Po prostu zamień go na swój własny kod. – fmark

+1

Hmm, nie wiedziałem o obiekcie 'Timer', polecam przełączyć się na używanie go w poniższej odpowiedzi. – fmark

Powiązane problemy