2013-05-22 9 views
11

मैं समय कब तक उपप्रक्रिया ले करता है करना चाहते हैं। मैं हालांकि यह बहुत ही सटीक वहाँ एक बेहतर तरीका है मैं कितना समय उपप्रक्रिया वास्तव में खर्च करता है प्राप्त कर सकते हैं है (बहु प्रक्रिया वरना sth करने के लिए सुनिश्चित संबंधित नहीं) नहीं हैपाने में कितना समय अजगर उपप्रक्रिया खर्च करता है

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

का उपयोग करने की कोशिश की?

धन्यवाद!

उत्तर

8

यह जो समय आप चाहते हैं पर निर्भर करता है; विलुप्त समय, उपयोगकर्ता मोड, सिस्टम मोड?

resource.getrusage आप मौजूदा प्रक्रिया के बच्चों के उपयोगकर्ता मोड और सिस्टम मोड समय क्वेरी कर सकता है के साथ

। यूनिक्स प्लेटफार्मों पर यह केवल काम करता है (जैसे लिनक्स, BSD और OS X):

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

विंडोज पर आप शायद ctypes का उपयोग के Win32 एपीआई से बराबर जानकारी प्राप्त करना होगा।

+0

धन्यवाद! यह काफी जानकारीपूर्ण है! :) – Frost

+0

यह उत्तर टाइमिंग पायथन कोड के लिए ठीक दिखता है, लेकिन यदि हम उपप्रोसेस चला रहे हैं, तो यह सटीक नहीं हो सकता है, क्योंकि 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

यह मुझे थोड़ी देर के तारों के रूप में अजगर कोड के आसपास पास करने का annoyingness के कारण रोलाण्ड के समाधान को लागू करने के ले लिया है, इसलिए मैंने सोचा कि मैं एक काम उदाहरण का हिस्सा चाहते हैं।

यह स्क्रिप्ट बार काम कर निर्देशिका में एक बाहरी प्रोग्राम, और इसके मानक उत्पादन और फ़ाइलों के लिए मानक त्रुटि पुनर्निर्देश।

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

यदि यह आपके कोड को आसान बना देगा, तो आप एक फ़ंक्शन को 'टाइमिट()' पर पास कर सकते हैं और स्ट्रिंग के अंदर कोई पायथन कोड डालने से बच सकते हैं। –

संबंधित मुद्दे