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 time
keine 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 100
oder 1000
es wurde eingegeben. Gibt es eine Möglichkeit, es zu verwenden time
oder eine bessere Möglichkeit, es zu tun? (außer das Programm zu ändern?)
Antwort1
Dies ist mit nicht möglich, Ctrl-C
da Sie neue Prozesse in einer Schleife generieren. Sie müssten alle Prozesse unterbrechen, indem Sie Ctrl-C
100, 1000 Mal so schnell drücken, wie jede Iteration ausgeführt wird.
Alternativ können Sie denselben Effekt mit erzielen, indem bash
Sie 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 bash
oder 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-py
eine Datei erstellen, $ echo "" > ./stop-foo-py
z. 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 ; done
in 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