2010-02-11 9 views
25

Necesito tener una clase base que usaré para heredar otras clases que me gustaría medir el tiempo de ejecución de sus funciones.cómo medir el tiempo de ejecución de funciones (automáticamente) en Python

Así intead 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 BaseClass tiene que tratar con el tiempo

+2

Sugeriría un decorador de clases en lugar de implementar el tiempo en BaseClass. – MattH

+3

¿Por qué no usar simplemente un generador de perfiles como cProfiler cada vez que quiera saber los tiempos? –

+0

@Justin cProfiler es bueno, pero lo que necesitaba era saber sobre los tiempos cada vez para informarlos. – pars

Respuesta

44

Una forma de hacerlo sería con un decorador (PEP for decorators)(first of a series of tutorial articles on decorators). Aquí hay un ejemplo que hace lo que quiere.

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 símbolo del pitón:

>>> 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' 
+0

¡Gracias por la gran respuesta! esto era exactamente lo que estaba buscando. – pars

+0

Gran ejemplo de código limpio para mostrar cómo los decoradores son una de las mejores alegrías en Python –

+0

¿Qué es timedec ??! –

9

medir ¿Ha comprobado el "profile" module?

I.e. ¿Está seguro de que necesita implementar su propio marco de trabajo personalizado en lugar de utilizar el mecanismo de creación de perfiles predeterminado para el idioma?

También puede buscar en Google "python hotshot" para obtener una solución similar.

+0

+1 para crear perfiles. – Khelben

5

También hay timeit, que forma parte de la biblioteca estándar, y es realmente fácil de usar. Recuerde: ¡no reinvente la rueda!

+0

¡De hecho, muy simple y fácil de usar! –

+0

¡tiempo parece prometedor! Lo combinaré con la solución de Geoff. – pars

+0

https://twitter.com/davidjbland/status/634059970699358208 – rebeling

Cuestiones relacionadas