2013-05-22 22 views
11

Tôi muốn thời gian tiến hành xử lý con. Tôi cố gắng để sử dụngnhận được bao nhiêu thời gian xử lý con trăn chi tiêu

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

Tuy nhiên nó không phải là rất chính xác (không chắc chắn liên quan đến đa quá trình hoặc sth khác) Có cách nào tốt hơn tôi có thể nhận được bao nhiêu thời gian tiến trình con thực sự dành?

Cảm ơn bạn!

Trả lời

8

Nó phụ thuộc vào thời gian mà bạn muốn; thời gian trôi qua, chế độ người dùng, chế độ hệ thống?

Với resource.getrusage bạn có thể truy vấn chế độ người dùng và thời gian chế độ hệ thống của trẻ em trong quá trình hiện tại. Đây chỉ hoạt động trên nền tảng UNIX (như ví dụ Linux, BSD và OS X):

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

Trên Windows có thể bạn sẽ phải sử dụng ctypes để có được thông tin tương đương từ API Win32.

+0

cảm ơn bạn! đó là khá nhiều thông tin! :) – Frost

+0

câu trả lời này có vẻ tốt cho thời gian mã python, nhưng nếu chúng ta đang chạy một subprocess, điều này có thể không chính xác, kể từ khi Popen.wait() sử dụng một vòng lặp bận rộn. [https://docs.python.org/dev/library/subprocess.html#subprocess.Popen.wait] – ggg

+0

@ggg Không chắc chắn nếu điều này thực sự là một vấn đề: Popen.wait() nên chạy trong quá trình hiện tại. Do đó, việc sử dụng tài nguyên của các tiến trình con không nên bị ảnh hưởng. – Steohan

6

Đây là chính xác hơn:

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

Tôi mất một chút thời gian để thực hiện giải pháp của Roland do sự phiền toái khi đi qua mã python như chuỗi, vì vậy tôi nghĩ tôi sẽ chia sẻ một ví dụ làm việc.

Kịch bản này lần một chương trình bên ngoài trong thư mục làm việc, và chuyển hướng đầu ra tiêu chuẩn và lỗi chuẩn của nó vào tệp.

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

Nếu nó làm cho mã của bạn dễ dàng hơn, bạn có thể chuyển một hàm thành 'timeit()' và tránh phải đặt bất kỳ mã Python nào bên trong các chuỗi. –

Các vấn đề liên quan