2013-05-22 15 views
11

サブプロセスがどれくらいの時間を取っているかを調べたい。 私はそれが (マルチプロセスまたはs番目の他に、関連わからない)非常に正確ではありませんしかしpythonサブプロセスがどれくらいの時間を費やすかを調べる

start = time.time() 
subprocess.call('....') 
elapsed = (time.time() - start) 

を使用しようとした私は、サブプロセスが実際に費やしているどのくらいの時間を得ることができ、より良い方法はありますか?

ありがとうございました!

答えて

8

それはあなたが望むどの時間に依存します。経過時間、ユーザーモード、システムモード?

resource.getrusageを使用すると、現在のプロセスの子プロセスのユーザーモードとシステムモード時間を照会できます。 (例えばLinuxでは、BSDやOS Xなど)UNIXプラットフォーム上でのみ動作します。Windows上で

import resource 
info = resource.getrusage(resource.RUSAGE_CHILDREN) 

あなたはおそらくWIN32のAPIから同等の情報を取得するためにctypesを使用する必要があります。

+0

ありがとうございました!それはかなり有益です! :) – Frost

+0

この答えは、タイミングのPythonコードでは問題ないようですが、Popen.wait()がビジーループを使用しているため、サブプロセスを実行している場合、正確ではない可能性があります。 [https://docs.python.org/dev/library/subprocess.html#subprocess.Popen.wait] – ggg

+0

@gggこれが本当に問題なのかどうかは不明です。Popen.wait()は現在のプロセスで実行する必要があります。したがって、子プロセスのリソース使用は影響を受けてはなりません。 – Steohan

6

これは、より正確である:

from timeit import timeit 
print timeit(stmt = "subprocess.call('...')", setup = "import subprocess", number = 100) 
2

Pythonコードを文字列として渡すという煩わしさから、Rolandのソリューションを実装するのに少し時間がかかったので、私は実際の例を分かち合うと思いました。

このスクリプトは、作業ディレクトリに外部プログラムを置き、標準出力と標準エラーをファイルにリダイレクトします。

from timeit import timeit 

reps = 500 
stdout = open("add_numbers_outputs.log", 'w') 
stderr = open("add_numbers_errors.log", 'w') 
external_command = "./add_numbers" 
parameter = str(1000000) # one million 

call_arguments = """[ 
     '%s', 
     '%s'], # pass additional parameters by adding elements to this list 
     stdout=stdout, 
     stderr=stderr 
""" % (external_command, parameter) 

print "Timing external command "+external_command+" with parameter "+parameter 

time_taken = timeit(stmt = "subprocess.call(%s)" % call_arguments, 
     setup = """import subprocess; 
stdout = open("add_numbers_outputs.log", 'w'); 
stderr = open("add_numbers_errors.log", 'w') 
""", 
     number = reps)/reps 

print "Average time taken for %s repetitions: %f seconds" % (reps, time_taken) 
+0

コードを簡単にするならば、関数を 'timeit()'に渡すことができ、Pythonコードを文字列の中に入れなくても済むようになります。 –

関連する問題