oriented - Cómo medir el tiempo de ejecución de funciones(automáticamente) en Python
python oop exercises (3)
Necesito tener una clase base que usaré para heredar otras clases que me gustaría medir el tiempo de ejecución de sus funciones.
Así que en vez de tener algo como esto:
class Worker():
def doSomething(self):
start = time.time()
... do something
elapsed = (time.time() - start)
print "doSomething() took ", elapsed, " time to finish"
#outputs: doSomething() took XX time to finish
Me gustaría tener algo como esto:
class Worker(BaseClass):
def doSomething(self):
... do something
#outputs the same: doSomething() took XX time to finish
Así que la clase base necesita lidiar con la medición del tiempo.
¿Has comprobado el módulo "perfil" ?
¿Está seguro de que necesita implementar su propio marco personalizado en lugar de utilizar el mecanismo de creación de perfiles predeterminado para el idioma?
También puede buscar en Google "hotshot de Python" para una solución similar.
También existe timeit , que forma parte de la biblioteca estándar y es realmente fácil de usar. Recuerda: ¡no reinventes la rueda!
Una forma de hacerlo sería con un decorador (PEP para decoradores) (el primero de una serie de artículos de tutoría sobre decoradores) . Aquí hay un ejemplo que hace lo que quieres.
from functools import wraps
from time import time
def timed(f):
@wraps(f)
def wrapper(*args, **kwds):
start = time()
result = f(*args, **kwds)
elapsed = time() - start
print "%s took %d time to finish" % (f.__name__, elapsed)
return result
return wrapper
Este es un ejemplo de su uso.
@timed
def somefunction(countto):
for i in xrange(countto):
pass
return "Done"
Para mostrar cómo funciona, llamé a la función desde el indicador de python:
>>> timedec.somefunction(10000000)
somefunction took 0 time to finish
''Done''
>>> timedec.somefunction(100000000)
somefunction took 2 time to finish
''Done''
>>> timedec.somefunction(1000000000)
somefunction took 22 time to finish
''Done''