এখানে অনেক ভাল উত্তরের পাশাপাশি কয়েকটি অন্যান্য নিবন্ধের পরে আমার অনুসন্ধানগুলি এখানে রয়েছে।
প্রথমত, যদি আপনি timeit
এবং এর মধ্যে বিতর্ক করছেন time.time
তবে timeit
এর দুটি সুবিধা রয়েছে:
timeit
আপনার ওএস এবং পাইথন সংস্করণে পাওয়া সেরা টাইমার নির্বাচন করে।
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
সুবিধাদি:
চারপাশে বেশ কয়েকটি অর্ধ-ব্যাক ভার্সন ভাসমান তাই আমি কয়েকটি হাইলাইট তুলে ধরতে চাই:
- আগে বর্ণিত কারণে টাইম.টাইমের পরিবর্তে সময় থেকে টাইমার ব্যবহার করুন।
- আপনি চাইলে টাইমিংয়ের সময় জিসি অক্ষম করতে পারেন।
- সাজসজ্জাবিদ নামযুক্ত বা নামবিহীন প্যারাম সহ ফাংশন গ্রহণ করে।
- ব্লক টাইমিংয়ে মুদ্রণ অক্ষম করার ক্ষমতা (ব্যবহার
with utils.MeasureBlockTime() as t
এবং তারপরে t.elapsed
)।
- ব্লক সময়ের জন্য জিসি সক্ষম রাখার ক্ষমতা।