2017-08-19 2 views
1

私はpython3スクリプトを使用していくつかのジョブを自動化しています。 そのような外部ジョブの時間を測定する必要があります。だから私は、サブプロセスモジュールと組み合わせて)内蔵の時間(のpython 3を使用することにしました:Python 3のサブプロセスが同等のbashよりも遅い

with open(in_files[i],'r') as f, open(sol_files[i],'w') as f_sol: 
     start = time.time() 
     process = subprocess.run(['./'+src_files[i]], stdin = f, stdout=f_sol) 
     end = time.time() 

このPythonのスニペットによって算出した経過時間が0.73秒しかし

、同等のbashコマンドである:

time ./file <input_file> output_file 

は大幅に高速化されます。この巨大な矛盾を引き起こしている可能性が0.5秒

?たぶん、リダイレクトの使用のために、Pythonインタプリタでコンテキストを切り替えることができますか?バッファリングに関連する何か?上記のコードの時間が1秒+無視できる時間経過し

start = time.time() 
process = subprocess.run(['sleep','1']) 
end = time.time() 

リダイレクト使用せずに同様のコードは、この挙動を示しません。

お礼

+0

0.5秒*は0.73秒よりも大幅に高速*とは考えられませんでした。あなたは数回測定を繰り返しましたか?たぶん、ランニングタイムの変動は、あなたが観察した差よりもはるかに大きいでしょう。 – mkrieger1

+0

はい、私はしました。結果は同じでした。 STDevは無視できた。宜しくお願いします –

答えて

1

愚かな間違いでした。

ほとんどのシステムでtime.time()は精度がよくありません。

時刻は常に浮動小数点数として返されますが、すべてのシステムで1秒よりも精度が高いとは限りません。この関数は通常、非減少値を返しますが、2つの呼び出しの間にシステムクロックが設定されていれば、以前の呼び出しより低い値を返すことができます。 Python 3 Time Module Documentation

perf_counter()またはprocess_time()だけで正常に動作します。サブプロセスに間違いはありません。

関連する問題