2011-01-18 18 views
6

Ho un ciclo che viene eseguito per un massimo di poche ore alla volta. come ho potuto dirmi quanto tempo è stato a un intervallo fisso?python -> tempo in cui il ciclo è in esecuzione

solo un generico ... Domanda

EDIT: si tratta di un ciclo while che corre permutazioni, così posso avere esso stampa il tempo di esecuzione ogni 10 secondi?

risposta

8

Invece di controllare il tempo su ogni ciclo, è possibile utilizzare un oggetto 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 Molto più bello della mia risposta, amore per quel pitone che include tali batterie. – fmark

1

C'è un modo molto hacky per farlo usando time.asctime(). Memorizzi l'asctime prima di entrare nel ciclo while e da qualche parte nel loop stesso. Calcola la differenza di tempo tra il tempo memorizzato e l'ora corrente e se tale differenza è di 10 secondi, quindi aggiorna il tempo memorizzato sull'ora corrente e stampa che è in esecuzione.

Tuttavia, questo è un modo molto hacky per farlo in quanto richiede una matematica contorta e noiosa.

Se il vostro scopo è quello di controllare il tempo di esecuzione di un algoritmo specifico, quindi è meglio usare il modulo timeit

Spero che questo aiuti

2

Come ha fatto notare, questo è un po 'di un brutto trucco , poiché implica controllare il tempo ogni iterazione. Affinché funzioni, è necessario disporre di attività eseguite per una piccola percentuale del timeout: se il ciclo esegue solo iterazioni ogni minuto, non verrà stampato ogni dieci secondi. Se vuoi essere interrotto, potresti considerare il multithreading, o preferibilmente se sei su linux/mac/unix, i segnali. Qual è la tua piattaforma?

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) 

uscita:

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

ohmygosh ti amo ma che cosa 'pass' fare? devo mettere qualcosa al posto di esso? – tekknolagi

+1

'pass' è l'operazione nulla, è solo un segnaposto e non fa nulla ([veramente] (http://docs.python.org/reference/simple_stmts.html#pass)). Basta sostituirlo con il tuo codice personale. – fmark

+1

Hmm, non conoscevo l'oggetto 'Timer', ti consiglio di passare ad usarlo nella risposta qui sotto. – fmark