2011-01-18 18 views
6

tengo un bucle que tiene una duración de hasta unas pocas horas a la vez. ¿Cómo podría decirme cuánto tiempo ha pasado en un intervalo establecido?pitón -> vez que un bucle while ha estado funcionando

sólo un genérico ... cuestionar

EDIT: es un bucle while que se ejecuta permutaciones, por lo que puede hacer que imprima i el tiempo que pasa cada 10 segundos?

Respuesta

8

En lugar de comprobar el tiempo en cada bucle, puede utilizar un objeto 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 Mucho mejor que mi respuesta, me encanta que Python tenga esas baterías incluidas. – fmark

1

Hay una forma poco limpia de hacer esto mediante el uso de time.asctime(). Guarde la hora de inicio antes de ingresar al ciclo while y en algún lugar del ciclo mismo. Calcule la diferencia de tiempo entre el tiempo almacenado y la hora actual, y si esa diferencia es de 10 segundos, actualice el tiempo almacenado a la hora actual e imprima que se ha estado ejecutando.

Sin embargo, esa es una forma poco limpia de hacerlo, ya que requiere un poco de matemática trenzado y aburrido.

Si su objetivo es comprobar el tiempo de ejecución de un algoritmo específico, entonces es mejor usar el módulo timeit

espero que esto ayude

2

Como se ha señalado, esto es un poco de un corte desagradable , ya que implica verificar el tiempo de cada iteración. Para que funcione, necesita tener tareas que se ejecutan durante un pequeño porcentaje del tiempo de espera; si su ciclo solo itera cada minuto, no se imprimirá cada diez segundos. Si desea que lo interrumpan, puede considerar la posibilidad de subprocesamiento múltiple, o preferiblemente si está en linux/mac/unix, señales. ¿Cuál es tu plataforma?

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) 

Salida:

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

ohmygosh Te quiero, pero ¿qué hace 'pass'? pongo algo en lugar de eso? – tekknolagi

+1

'pass' es la operación nula, es sólo un marcador de posición y no hace nada en absoluto ([realmente] (http://docs.python.org/reference/simple_stmts.html#pass)). Simplemente reemplácelo con su propio código. – fmark

+1

Hmm, no sabía sobre el objeto 'Timer', le recomendaría que cambie a usarlo en la respuesta a continuación. – fmark

Cuestiones relacionadas