timeit
मॉड्यूल के साथ खेलने के बाद , मुझे इसका इंटरफ़ेस पसंद नहीं है, जो निम्न दो विधि की तुलना में इतना सुंदर नहीं है।
निम्नलिखित कोड पायथन 3 में है।
डेकोरेटर विधि
यह @ माइक की विधि के साथ लगभग समान है। यहां मैं इसे बेहतर बनाने के लिए जोड़ता हूं kwargs
और functools
लपेटता हूं ।
def timeit(func):
@functools.wraps(func)
def newfunc(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
elapsedTime = time.time() - startTime
print('function [{}] finished in {} ms'.format(
func.__name__, int(elapsedTime * 1000)))
return newfunc
@timeit
def foobar():
mike = Person()
mike.think(30)
संदर्भ प्रबंधक विधि
from contextlib import contextmanager
@contextmanager
def timeit_context(name):
startTime = time.time()
yield
elapsedTime = time.time() - startTime
print('[{}] finished in {} ms'.format(name, int(elapsedTime * 1000)))
उदाहरण के लिए, आप इसका उपयोग कर सकते हैं जैसे:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
और with
ब्लॉक के भीतर का कोड टाइम हो जाएगा।
निष्कर्ष
पहली विधि का उपयोग करते हुए, आप सामान्य कोड प्राप्त करने के लिए डेकोरेटर की टिप्पणी कर सकते हैं। हालांकि, यह केवल एक फ़ंक्शन कर सकता है। यदि आपके पास कोड का कुछ हिस्सा है जिसे आप इसे कार्य नहीं बनाते हैं, तो आप दूसरी विधि चुन सकते हैं।
उदाहरण के लिए, अब आपके पास है
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
अब आप bigImage = ...
लाइन में समय लगाना चाहते हैं । यदि आप इसे किसी फ़ंक्शन में बदलते हैं, तो यह होगा:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
बहुत अच्छा नहीं लग रहा है ... क्या होगा अगर आप पायथन 2 में हैं, जिसमें कोई nonlocal
कीवर्ड नहीं है ।
इसके बजाय, दूसरी विधि का उपयोग करना यहाँ बहुत अच्छी तरह से फिट बैठता है:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)