2013-03-29 2 views
52

मैं पाइथन प्रोग्राम, में कोड के ब्लॉक का मूल्यांकन करने के लिए समाप्त समय को मापना चाहता हूं, संभवतः उपयोगकर्ता सीपीयू समय, सिस्टम सीपीयू समय और विलुप्त समय के बीच अलग हो रहा है।पायथन में कोड के ब्लॉक के निष्पादन का समय प्राप्त करें 2.7

मुझे timeit मॉड्यूल पता है, लेकिन मेरे पास कई आत्म-लिखित कार्य हैं और सेटअप प्रक्रिया में उन्हें पास करने के लिए बहुत आसान नहीं है।

मैं नहीं बल्कि कुछ ऐसा है जो की तरह इस्तेमाल किया जा सकता होगा:

#up to here I have done something.... 
start_counting() #or whatever command used to mark that I want to measure 
        #the time elapsed in the next rows 
# code I want to evaluate 
user,system,elapsed = stop_counting() #or whatever command says: 
             #stop the timer and return the times 

उपयोगकर्ता और सिस्टम सीपीयू बार आवश्यक (हालांकि मैं उन्हें मापने के लिए चाहते हैं) नहीं हैं, लेकिन बीता हुआ समय के लिए मैं चाहूँगा जटिल आदेशों या मॉड्यूल का उपयोग करने के बजाय इस तरह कुछ करने में सक्षम होने के लिए।

उत्तर

122

सेकंड में व्यतीत समय पाने के लिए आपको timeit.default_timer() उपयोग कर सकते हैं:

import timeit 
start_time = timeit.default_timer() 
# code you want to evaluate 
elapsed = timeit.default_timer() - start_time 

timeit.default_timer()time.time() या time.clock() के बजाय प्रयोग किया जाता है, क्योंकि यह समय समारोह किसी भी मंच के लिए उच्च संकल्प किया है कि चयन करेंगे।

+1

मुझे लगता है कि पढ़ लिया है में सीपीयू और दीवार समय पाने के लिए - - अभिव्यक्ति पर सीधे सीपीयू और दीवार समय

%timeit <expression> पाने के लिए

%time <expression>: IPython में आप उपयोगी सामग्री का एक बहुत से अधिक हो गया यह कोड के ब्लॉक के लिए सबसे अच्छा तरीका नहीं है जो चलाने के लिए केवल दूसरे का एक अंश लेता है। मुझे लगता है कि समय मॉड्यूल का उपयोग करते हुए .clock() विधि को प्राथमिकता दी जाती है? http://stackoverflow.com/questions/85451/python-time-clock-vs-time-time-accuracy – lucacerone

+1

'timeit.default_timer()' का उपयोग करने के लिए मेरा उत्तर बदल गया, जो 'time.time()' के बीच चयन करेगा। या 'time.clock()' जिस पर आप उपयोग कर रहे प्लेटफ़ॉर्म पर उच्च रिज़ॉल्यूशन रखते हैं। –

+0

धन्यवाद, default_timer() बेहतर लगता है। इस पृष्ठ में सलाह भी बहुत अच्छी लगती है! http://www.huyng.com/posts/python-performance-analysis/ – lucacerone

15

मैं निष्पादन समय प्राप्त करने सहित मौजूदा कार्य के लिए कुछ अतिरिक्त काम करने के लिए हमेशा एक सजावटी का उपयोग करता हूं। यह पाइथोनिक और सरल है।

import time 

def time_usage(func): 
    def wrapper(*args, **kwargs): 
     beg_ts = time.time() 
     retval = func(*args, **kwargs) 
     end_ts = time.time() 
     print("elapsed time: %f" % (end_ts - beg_ts)) 
     return retval 
    return wrapper 

@time_usage 
def test(): 
    for i in xrange(0, 10000): 
     pass 

if __name__ == "__main__": 
    test() 
+2

मुझे खेद है, मुझे अभी भी पता नहीं है कि सजावट का उपयोग कैसे करें :( – lucacerone

+4

@LucaCerone सजावट http: // stackoverflow के बारे में एक उत्कृष्ट स्पष्टीकरण है ।कॉम/प्रश्न/739654/समझ-पायथन-सजावट। इसे धैर्यपूर्वक पढ़ने की कोशिश करें और आप सजावटी को समझेंगे। – Yarkee

+0

धन्यवाद यह वास्तव में एक दिलचस्प पोस्ट है! – lucacerone

7

उदाहरण के लिए आप संदर्भ प्रबंधक के माध्यम से इस लक्ष्य को हासिल कर सकते हैं,:

from contextlib import contextmanager 
import time 
import logging 
@contextmanager 
def _log_time_usage(prefix=""): 
    '''log the time usage in a code block 
    prefix: the prefix text to show 
    ''' 
    start = time.time() 
    try: 
     yield 
    finally: 
     end = time.time() 
     elapsed_seconds = float("%.2f" % (end - start)) 
     logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds) 

उपयोग उदाहरण:

with _log_time_usage("sleep 1: "): 
    time.sleep(1) 
+0

यह अंतिम पंक्ति में 'prefix' होना चाहिए, 'item_name' नहीं होना चाहिए। –

+0

@ जॉर्ज पेट्रोवो धन्यवाद, मैंने इसे सही कर दिया है। – monklof

6

मुझे लगने बार-बार इस समस्या को हल, तो मैं अंत में बनाया इसके लिए librarypip install timer_cm के साथ स्थापित करें। तब:

from time import sleep 
from timer_cm import Timer 

with Timer('Long task') as timer: 
    with timer.child('First step'): 
     sleep(1) 
    for _ in range(5): 
     with timer.child('Baby steps'): 
      sleep(.5) 

आउटपुट:

Long task: 3.520s 
    Baby steps: 2.518s (71%) 
    First step: 1.001s (28%) 
+0

मैंने उठाए गए एक प्रत्याशित प्रासंगिक प्रश्न: https://stackoverflow.com/questions/48260833/make-a-child-of-a-timer-cm-timer-object-in-a-called- कार्यक्षमता – lurix66

+0

महान काम करता है, सिवाय इसके कि एक टाइपो ('आयात टाइमर' ---> 'आयात टाइमर') और एक लापता पैकेज ('आयात समय') – user3768495

+0

शीश। आप सही हे। मैंने अपना जवाब सही किया। –

0

एक और विकल्प है जो मैं सादगी के लिए अब एक बहुत प्यार करता है - ipython। अभिव्यक्ति का एक पाश

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