මෙන්න බොහෝ හොඳ පිළිතුරු මෙන්ම තවත් ලිපි කිහිපයක් බැලීමෙන් පසු මගේ සොයා ගැනීම්.
පළමුව, ඔබ 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
වාසි:
අර්ධ පිටුබලය සහිත අනුවාද කිහිපයක් වටා පාවෙමින් තිබේ, එබැවින් මට විශේෂ අවස්ථා කිහිපයක් පෙන්වා දීමට අවශ්යය:
- කලින් විස්තර කර ඇති හේතු සඳහා time.time වෙනුවට timeit වෙතින් ටයිමරය භාවිතා කරන්න.
- ඔබට අවශ්ය නම් වේලාව තුළ GC අක්රීය කළ හැකිය.
- සැරසිලි කරන්නා නම් කරන ලද හෝ නම් නොකළ පරාමිතීන් සමඟ කාර්යයන් භාර ගනී.
- වාරණ කාලවලදී මුද්රණය අක්රීය කිරීමේ හැකියාව (භාවිතා
with utils.MeasureBlockTime() as t
කර පසුව භාවිතා කරන්නt.elapsed
).
- වාරණ කාලය සඳහා gc සක්රීයව තබා ගැනීමේ හැකියාව.