¿Hay una manera simple de sincronizar la ejecución de un programa Python?¿Cómo se cronometra cuánto tarda un programa de Python en ejecutarse?
aclaración: programas enteros
¿Hay una manera simple de sincronizar la ejecución de un programa Python?¿Cómo se cronometra cuánto tarda un programa de Python en ejecutarse?
aclaración: programas enteros
Uso timeit
:
Este módulo proporciona una forma sencilla de tiempo pequeños trozos de código Python. Tiene tanto línea de comando como interfaces invocables. Evita una serie de trampas comunes para medir los tiempos de ejecución.
Necesitará una declaración de python en una cadena; si tiene una función principal en el código, se puede utilizar de esta manera:
>>> from timeit import Timer
>>> timer = Timer('main()', 'from yourmodule import main')
>>> print timer.timeit()
La segunda cadena proporciona la configuración, el medio ambiente para la primera sentencia a ser programado en la segunda parte no está siendo programado,. y está destinado a establecer el escenario por así decirlo. La primera cadena se ejecuta a través de sus ritmos; por defecto un millón de veces, para obtener tiempos precisos.
Si necesita más detalles en cuanto a donde las cosas son lentas, utilice uno de los python profilers
:
Un perfilador es un programa que describe el rendimiento de tiempo de ejecución de un programa, proporcionando una variedad de estadísticas.
La forma más fácil de ejecutar esto es mediante el uso del módulo cProfile
desde la línea de comandos:
$ python -m cProfile yourprogram.py
Uso timeit
>>> import timeit
>>> t = timeit.Timer(stmt="lst = ['c'] * 100")
>>> print t.timeit()
1.10580182076
>>> t = timeit.Timer(stmt="lst = ['c' for x in xrange(100)]")
>>> print t.timeit()
7.66900897026
Es posible que desee utilizar una función de profiler.
También es posible que desee medir el tiempo de funcionamiento de la función mediante el uso siguiente decorador simple:
import time
def myprof(func):
def wrapping_fun(*args):
start = time.clock()
result = func(*args)
end = time.clock()
print 'Run time of %s is %4.2fs' % (func.__name__, (end - start))
return result
return wrapping_fun
Uso:
@myprof
def myfun():
# function body
Esa es una función de creación de perfiles bastante deficiente. En primer lugar, no me basaría en nada que valga la pena evaluar comparativamente. – delnan
@delnan ¿Puedes explicar por qué? – MyNameIsKhan
Numerosas razones, la mayoría de las cuales se reducen a "ninguno de nosotros es lo suficientemente inteligente como para hacerlo bien de forma directa". Para principiantes, 'time.clock' no es el reloj más preciso en todas las plataformas (cf.' default_clock() 'definido por' timetit'), y la salida es muy limitada (entremezclada con la salida del programa, necesita recopilarse y analizarse por mano). Los problemas menores incluyen no tener en cuenta las excepciones y no usar 'functools.wrap'. – delnan
Si estás en plataforma Linux/Unix/POSIX-combatible sólo tiene que utilizar time
. De esta forma, no interferirá con su script y no lo ralentizará con un perfil innecesariamente detallado (para usted). Naturalmente, puede usarlo para prácticamente cualquier cosa, no solo para los scripts de Python.
Miré el enlace y me pareció un poco confuso. ¿Hay un script sencillo que muestre cómo usar esto? – MyNameIsKhan
'timeit' es para micro-benchmarks: diminutos fragmentos de programa, no programas completos. – delnan
Si todo lo que quiere saber es si es rápido o lento, 'timeit' está bien. Si necesita saber * dónde * es lento en un programa más grande, necesita un perfil. –