Ejecuto mi código en un bucle para muchos objetos y parece que procesan demasiado tiempo.

Me gustaría agregar una condición que detenga la ejecución después de 30 minutos, por ejemplo. ¿Cómo deberia hacerse? ¿Necesito otro para el bucle y el módulo timeit para eso o se puede hacer más fácil?

0
Keithx 8 oct. 2019 a las 15:30

3 respuestas

La mejor respuesta

Puedes hacerlo con algo como esto:

import time

time_limit = 60 * 30 # Number of seconds in one minute
t0 = time.time()
for obj in list_of_objects_to_iterate_over:
    do_some_stuff(obj)   
    if time.time() - t0 > time_limit:
        break  

La instrucción break saldrá del ciclo cada vez que se llegue al final de su iteración después del límite de tiempo que ha establecido.

2
Joseph Budin 8 oct. 2019 a las 12:40

Así que aquí está mi variante de cómo se puede hacer esto (suponiendo que recopilemos datos a través de la respuesta SQL):

  for i in items:
    if total_records % 100 == 0:
        logger.warning(
            "Processed {} items in {} ms".format(total_records, int(time.time() * 1000) - start_time_ms))
    if int(time.time() * 1000) - start_time_ms > 3600000:
        cur.close()
        conn.close()
        return total_records
0
Keithx 9 oct. 2019 a las 13:53

Puede implementar una hora de inicio y dejar de ejecutar después de 30 minutos de la hora de inicio

from datetime import datetime, timedelta
starting_time = datetime.now()
for item in something:
    #do something
    if (datetime.now()- starting_time) //timedelta(minutes=1) >= 30:
        break

1
nexla 8 oct. 2019 a las 12:38
58286411