So können Sie die Zeit für einen Befehl N-mal messen (und ihn mit STRG-C stoppen)

So können Sie die Zeit für einen Befehl N-mal messen (und ihn mit STRG-C stoppen)

Kurze Frage:

Dies geschieht auf einem Mac:

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

aber STRG-C kann es nicht stoppen. Wie kann man es zum Laufen bringen? (oder wie kann man die Laufzeit N-mal messen?)


Einzelheiten:

Es gibt einige Standardtests des Programms von GitHub, und ich konnte sie ausführen:

 python3 foo.py

oder

 time python3 foo.py

und es wird eine Laufzeit von 0,27 Sekunden gemeldet. Da der Test für 1000 Testfälle und ein Test-Framework ausgelegt ist, möchte ich den Test nicht ändern und ihn daher 100 Mal messen. Es scheint, dass der Befehl timekeine Möglichkeit bietet, ihn 10 oder 100 Mal zu messen (das ist etwas seltsam an Unix, das so viele Jahre alt ist und in dem etwas so Nützliches und Einfaches nicht eingebaut ist time). Folgendes kann verwendet werden:

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

aber STRG-C kann es nicht stoppen – es stoppt dieses eine Python-Skript und führt den Rest weiter aus. Glücklicherweise war es das nicht 100oder 1000es wurde eingegeben. Gibt es eine Möglichkeit, es zu verwenden timeoder eine bessere Möglichkeit, es zu tun? (außer das Programm zu ändern?)

Antwort1

Dies ist mit nicht möglich, Ctrl-Cda Sie neue Prozesse in einer Schleife generieren. Sie müssten alle Prozesse unterbrechen, indem Sie Ctrl-C100, 1000 Mal so schnell drücken, wie jede Iteration ausgeführt wird.
Alternativ können Sie denselben Effekt mit erzielen, indem bashSie drücken Ctrl-Z, wodurch der letzte durch die Schleife erstellte Vordergrundprozess gestoppt wird undaufhörendie Schleife selbst.

Antwort2

Angenommen, die Shell ist zsh, führen Sie einfach Folgendes aus:

time (repeat 10 python3 foo.py)

Das multipliziert die Anzahl der Prozesse (und der gewarteten untergeordneten Prozesse), die die Subshell ausführen, die den Python3-Befehl 10 Mal ausführt.

Mit bashoder ksh93(oder zsh) können Sie Folgendes tun:

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

POSIX-mäßig könnten Sie Folgendes tun:

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

Antwort3

Es ist keine „Strg+C“-Lösung, sondern etwas, wenn Sie eine lange Schleifensequenz „anmutig“ stoppen möchten. Sie müssen lediglich ./stop-foo-pyeine Datei erstellen, $ echo "" > ./stop-foo-pyz. B. mit (in einem anderen Terminal).

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

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

Es fügt etwa die HälfteMSpro einzelner Schleife.

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

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

verwandte Informationen