Quiero crear una función de Python para probar el tiempo empleado en cada función e imprimir su nombre con su tiempo, cómo puedo imprimir el nombre de la función y si hay otra forma de hacerlo, por favor dígame
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
para la medición. No es perfecto, pero supera con creces su puñalada y es mucho más fácil de usartimeit
que preparar algo mejor usted mismo.Respuestas:
En primer lugar, le recomiendo usar un perfilador o al menos usar el tiempo .
Sin embargo, si desea escribir su propio método de tiempo estrictamente para aprender, aquí hay un lugar para comenzar a usar un decorador.
Python 2:
Y el uso es muy simple, solo use el decorador @timing:
Python 3:
Tenga en cuenta que estoy llamando
f.func_name
para obtener el nombre de la función como una cadena (en Python 2) of.__name__
en Python 3.fuente
Después de jugar con el
timeit
módulo, no me gusta su interfaz, que no es tan elegante en comparación con los dos métodos siguientes.El siguiente código está en Python 3.
El método decorador
Esto es casi lo mismo con el método de @ Mike. Aquí agrego
kwargs
yfunctools
envuelvo para hacerlo mejor.El método del administrador de contexto
Por ejemplo, puedes usarlo como:
Y el código dentro del
with
bloque será cronometrado.Conclusión
Usando el primer método, puede comentar fácilmente el decorador para obtener el código normal. Sin embargo, solo puede cronometrar una función. Si tiene alguna parte del código que no sabe qué hacer para que sea una función, puede elegir el segundo método.
Por ejemplo, ahora tienes
Ahora quieres cronometrar la
bigImage = ...
línea. Si lo cambia a una función, será:No se ve tan bien ... ¿Qué pasa si estás en Python 2, que no tiene
nonlocal
palabra clave?En cambio, usar el segundo método encaja muy bien aquí:
fuente
timeit
interfaz y usar lawraps()
función delfunctools
módulo. Me refiero a que todo ese código extra no es necesario.import functools
No veo cuál es el problema con el
timeit
módulo. Esta es probablemente la forma más sencilla de hacerlo.También es posible enviar argumentos a las funciones. Todo lo que necesitas es terminar tu función usando decoradores. Más explicación aquí: http://www.pythoncentral.io/time-a-python-function/
El único caso en el que podría estar interesado en escribir sus propias declaraciones de temporización es si desea ejecutar una función solo una vez y también desea obtener su valor de retorno.
La ventaja de usar el
timeit
módulo es que le permite repetir el número de ejecuciones. Esto puede ser necesario porque otros procesos pueden interferir con la precisión de su tiempo. Por lo tanto, debe ejecutarlo varias veces y mirar el valor más bajo.fuente
timeit.timeit(lambda: func(a,b,c), number=1)
? Lo uso cuando hago pruebas en una solución hipotética en una terminal.Timeit tiene dos grandes fallas: no devuelve el valor de retorno de la función y usa eval, que requiere pasar un código de configuración adicional para las importaciones. Esto resuelve ambos problemas de manera simple y elegante:
fuente
Hay una herramienta fácil para el tiempo. https://github.com/RalphMao/PyTimer
Puede funcionar como un decorador :
Salida:
También puede funcionar como un temporizador de complemento con control de espacio de nombres (útil si lo está insertando en una función que tiene muchos códigos y se puede llamar a cualquier otro lugar).
Salida:
Espero que ayude
fuente
Método de decorador utilizando la biblioteca decoradora de Python:
Ver publicación en mi blog:
publicar en el blog mobilepro.pl
mi publicación en Google Plus
fuente
Mi forma de hacerlo:
Establezca una variable como
start = time()
antes ejecute la función / bucles, yprintTime(start)
justo después del bloque.y tienes la respuesta
fuente