短い質問:
これは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
(Unixでは少し奇妙なことです。数年が過ぎた後もそのように便利で簡単なものがUnixに組み込まれていないためです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