Cómo `cronometrar` un comando N veces (y poder usar CTRL-C para detenerlo)

Cómo `cronometrar` un comando N veces (y poder usar CTRL-C para detenerlo)

Pregunta corta:

Esto se hace en una Mac:

time for i in {1..10}; do python3 foo.py ; done

pero CTRL-C no podrá detenerlo. ¿Cómo hacer que funcione? (¿o cómo cronometrar el tiempo de ejecución de N veces?)


Detalles:

Hay una prueba estándar del programa de github y podría ejecutarla:

 python3 foo.py

o

 time python3 foo.py

e informa un tiempo de ejecución de 0,27 segundos. Dado que la prueba está conectada para 1000 casos de prueba y a un marco de prueba, no quiero cambiar la prueba, por lo que quiero cronometrarla 100 veces. Parece que el comando timeno tiene forma de cronometrar 10 o 100 veces (esto es algo extraño en Unix que durante tantos años y algo tan útil y simple no esté integrado time). Se puede utilizar lo siguiente:

time for i in {1..10}; do python3 foo.py ; done

pero CTRL-C no podrá detenerlo: detendrá ese script de Python y seguirá ejecutando el resto. Afortunadamente no fue así 100o 1000fue escrito. ¿Hay alguna manera de usarlo timeo una mejor manera de hacerlo? (¿además de cambiar el programa?)

Respuesta1

No es posible Ctrl-Cporque estás generando nuevos procesos en un bucle. Tendría que interrumpirlos todos presionando Ctrl-C100, 1000 veces más rápido a medida que se ejecuta cada iteración.
Como alternativa, puede lograr el mismo efecto bashpresionando Ctrl-Z, lo que detendría el último proceso de primer plano creado por el bucle yabandonarel bucle mismo.

Respuesta2

Suponiendo que el shell es zsh, simplemente haz:

time (repeat 10 python3 foo.py)

Eso multiplica el proceso (y esperó a los niños) que ejecuta el subshell que ejecuta el comando python3 10 veces.

Con basho ksh93(o zsh), puedes hacer:

time (for ((i=0;i<10;i++)) { python3 foo.py; })

POSIXly, podrías hacer:

time -p sh -c '
  i=0; while [ "$i" -lt 10 ]; do
    python3 foo.py
    i=$((i + 1))
  done'

Respuesta3

No es una solución "Ctrl+C", sino algo si desea detener una secuencia de bucle larga "elegantemente". Todo lo que necesitas hacer es crear ./stop-foo-pyun archivo; con $ echo "" > ./stop-foo-pypor ejemplo (en otra terminal).

rm ./stop-foo-py
time for ((i=0;i<1000;i++));
    do if [ ! -f "./stop-foo-py" ]; then
        python foo.py ;
        fi ;
    done

o rm ./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; doneen una línea.

Agrega aproximadamente la mitad deEMpor bucle único.

$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done

real    0m0.548s
user    0m0.157s
sys     0m0.359s

información relacionada