Burada birkaç iyi makalenin yanı sıra birçok iyi cevaptan geçtikten sonra bulgularım.
İlk olarak, timeit
ve arasında tartışıyorsanız time.time
, timeit
bunun iki avantajı vardır:
timeit
işletim sisteminizde ve Python sürümünüzde bulunan en iyi zamanlayıcıyı seçer.
timeit
çöp toplamayı devre dışı bırakır, ancak bu isteyebileceğiniz veya istemeyeceğiniz bir şey değildir.
Şimdi sorun timeit
o kadar basit değil çünkü kurulum gerekiyor ve bir sürü ithalatınız olduğunda işler çirkinleşiyor. İdeal olarak, sadece bir dekoratör istersiniz veyawith
blok ve ölçüm süresini kullanırsınız. Ne yazık ki, bunun için yerleşik bir şey yok, bu yüzden iki seçeneğiniz var:
1. Seçenek: Zaman çizelgesi kitaplığını kullanma
Timebudget yüklemek pip sonra bir satır kod sadece kullanabilecekleri çok yönlü ve çok basit bir kütüphanedir.
@timebudget # Record how long this function takes
def my_method():
# my code
2. Seçenek: Kod modülünü doğrudan kullanın
Aşağıda küçük yarar modülünü oluşturdum.
# 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
Şimdi sadece önünde bir dekoratör koyarak herhangi bir işlevi zamanlayabilirsiniz:
import utils
@utils.MeasureTime
def MyBigFunc():
#do something time consuming
for i in range(10000):
print(i)
Kodun bir kısmını zamanlamak istiyorsanız, with
bloğun içine koyun :
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
Avantajları:
Birkaç vurgulamak işaret etmek istiyorum etrafında yüzen birkaç yarı destekli sürümleri vardır:
- Daha önce açıklanan nedenler için zamanlayıcıyı time.time yerine timeit'den kullanın.
- İsterseniz zamanlama sırasında GC'yi devre dışı bırakabilirsiniz.
- Dekoratör adlandırılmış veya adlandırılmamış parametrelerle işlevleri kabul eder.
- Blok zamanlamasında yazdırmayı devre dışı bırakma özelliği (
with utils.MeasureBlockTime() as t
ve sonra kullanın t.elapsed
).
- Blok zamanlaması için gc'yi etkin tutma yeteneği.