짧은 질문:
이 작업은 Mac에서 수행됩니다.
time for i in {1..10}; do python3 foo.py ; done
하지만 CTRL-C는 이를 막을 수 없습니다. 어떻게 작동하게 만들까요? (또는 N번의 실행 시간을 측정하는 방법은 무엇입니까?)
세부 사항:
내가 실행할 수 있는 몇 가지 표준 프로그램 테스트가 github에 있습니다.
python3 foo.py
또는
time python3 foo.py
실행 시간은 0.27초로 보고됩니다. 1000개의 테스트 사례가 연결되어 있고 테스트 프레임워크에 연결되어 있으므로 테스트를 변경하고 싶지 않으므로 시간을 100번 측정하고 싶습니다. 이 명령이 10번이나 100번의 시간을 측정할 수 있는 방법은 없는 것 같습니다 time
(유닉스에서는 약간 이상한 일입니다. 수년이 지난 후에도 그렇게 유용하고 간단한 것이 유닉스에 내장되지 않았기 때문입니다 time
). 다음을 사용할 수 있습니다:
time for i in {1..10}; do python3 foo.py ; done
그러나 CTRL-C는 이를 중지하지 않습니다. Python 스크립트를 중지하고 나머지를 계속 실행합니다. 운 좋게도 그렇지 않거나 100
입력 되지 않았습니다 1000
. time
이것을 사용하는 방법이나 더 좋은 방법이 있습니까 ? (프로그램을 바꾸는 것 외에?)
답변1
Ctrl-C
루프에서 새 프로세스를 생성하기 때문에 이는 불가능합니다 . Ctrl-C
각 반복 속도의 100, 1000배에서 이 모든 것을 깨뜨려야 합니다 . 대안으로,
루프에 의해 생성된 최신 포그라운드 프로세스를 중지하는 을 눌러 동일한 효과를 얻을 수 있습니다.bash
Ctrl-Z
사직하다루프 자체.
답변2
쉘이 다음과 같다고 가정 zsh
하면 다음을 수행하십시오.
time (repeat 10 python3 foo.py)
서브쉘을 실행하고 서브프로세스를 기다리는 프로세스는 python3 명령을 10번 실행합니다.
bash
또는 ksh93
(또는 )을 사용하여 zsh
다음을 수행할 수 있습니다.
time (for ((i=0;i<10;i++)) { python3 foo.py; })
POSIXly에서는 다음과 같이 할 수 있습니다.
time -p sh -c '
i=0; while [ "$i" -lt 10 ]; do
python3 foo.py
i=$((i + 1))
done'
답변3
이것은 "Ctrl+C" 솔루션이 아니지만 긴 루핑 시퀀스를 "우아하게" 중지하려는 경우의 솔루션입니다. 예를 들어 다른 터미널에서 ./stop-foo-py
파일을 생성하기만 하면 됩니다 .$ echo "" > ./stop-foo-py
rm ./stop-foo-py
time for ((i=0;i<1000;i++));
do if [ ! -f "./stop-foo-py" ]; then
python foo.py ;
fi ;
done
아니면 rm ./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; done
줄을 서세요.
절반 정도 늘었다다발성 경화증매 사이클.
$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done
real 0m0.548s
user 0m0.157s
sys 0m0.359s