यहाँ कई अच्छे उत्तरों के साथ-साथ कुछ अन्य लेखों के माध्यम से जाने के बाद मेरे निष्कर्ष हैं।
सबसे पहले, यदि आप के बीच बहस कर रहे हैं timeit
और time.time
, timeit
दो फायदे हैं:
timeit
आपके OS और पायथन संस्करण पर उपलब्ध सर्वोत्तम टाइमर का चयन करता है।
timeit
हालांकि, कचरा संग्रहण को अक्षम कर देता है, लेकिन यह ऐसी चीज नहीं है जिसे आप चाहते हैं या नहीं भी कर सकते हैं।
अब समस्या यह है कि timeit
यह उपयोग करने के लिए इतना आसान नहीं है क्योंकि इसे सेटअप की आवश्यकता होती है और जब आप आयात का एक गुच्छा होता है तो चीजें बदसूरत हो जाती हैं। आदर्श रूप से, आप सिर्फ एक डेकोरेटर चाहते हैं या with
ब्लॉक और माप समय का उपयोग करते हैं । दुर्भाग्य से, इसके लिए कुछ भी उपलब्ध नहीं है, इसलिए आपके पास दो विकल्प हैं:
विकल्प 1: टाइमबडगेट लाइब्रेरी का उपयोग करें
Timebudget एक बहुमुखी और बहुत ही सरल पुस्तकालय है कि आप को स्थापित करने के बाद पिप कोड की एक पंक्ति में बस का उपयोग कर सकते है।
@timebudget # Record how long this function takes
def my_method():
# my code
विकल्प 2: सीधे कोड मॉड्यूल का उपयोग करें
मैंने थोड़ा उपयोगिता मॉड्यूल के नीचे बनाया है।
# utils.py
from functools import wraps
import gc
import timeit
def MeasureTime(f, no_print=False, disable_gc=False):
@wraps(f)
def _wrapper(*args, **kwargs):
gcold = gc.isenabled()
if disable_gc:
gc.disable()
start_time = timeit.default_timer()
try:
result = f(*args, **kwargs)
finally:
elapsed = timeit.default_timer() - start_time
if disable_gc and gcold:
gc.enable()
if not no_print:
print('"{}": {}s'.format(f.__name__, elapsed))
return result
return _wrapper
class MeasureBlockTime:
def __init__(self,name="(block)", no_print=False, disable_gc=False):
self.name = name
self.no_print = no_print
self.disable_gc = disable_gc
def __enter__(self):
self.gcold = gc.isenabled()
if self.disable_gc:
gc.disable()
self.start_time = timeit.default_timer()
def __exit__(self,ty,val,tb):
self.elapsed = timeit.default_timer() - self.start_time
if self.disable_gc and self.gcold:
gc.enable()
if not self.no_print:
print('Function "{}": {}s'.format(self.name, self.elapsed))
return False #re-raise any exceptions
अब आप किसी भी फंक्शन को उसके सामने डेकोरेटर लगाकर कर सकते हैं:
import utils
@utils.MeasureTime
def MyBigFunc():
#do something time consuming
for i in range(10000):
print(i)
यदि आप कोड का समय भाग चाहते हैं तो इसे with
ब्लॉक के अंदर रखें :
import utils
#somewhere in my code
with utils.MeasureBlockTime("MyBlock"):
#do something time consuming
for i in range(10000):
print(i)
# rest of my code
लाभ:
कई आधे-समर्थित संस्करण तैर रहे हैं इसलिए मैं कुछ हाइलाइट्स को इंगित करना चाहता हूं:
- पहले वर्णित कारणों के लिए समय के बजाय समय-समय पर टाइमर का उपयोग करें।
- आप चाहें तो समय के दौरान GC को अक्षम कर सकते हैं।
- डेकोरेटर नामित या अनाम पार्म्स के साथ कार्यों को स्वीकार करता है।
- ब्लॉक समय में मुद्रण को अक्षम करने की क्षमता (उपयोग
with utils.MeasureBlockTime() as t
और फिर t.elapsed
)।
- ब्लॉक टाइमिंग के लिए gc को सक्षम रखने की क्षमता।