Función de medida de tiempo de Python

8 minutos de lectura

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, dígame

def measureTime(a):
    start = time.clock() 
    a()
    elapsed = time.clock()
    elapsed = elapsed - start
    print "Time spent in (function name) is: ", elapsed

  • Las herramientas de creación de perfiles de Python pueden mostrarle los nombres de las funciones y el tiempo dedicado a cada una. Leer aquí: docs.python.org/library/profile.html

    – Maestro de carreteras

    29 mar. 11 a las 20:15


  • mejor uso timeit para la medición. No es perfecto, pero lo supera con creces y es mucho más fácil de usar. timeit que preparar algo mejor usted mismo.

    usuario395760

    29 mar. 11 a las 20:15

  • relacionado: ¿Medir el tiempo transcurrido en Python?

    – jfs

    25 feb. 16 a las 13:38

Funcion de medida de tiempo de Python
mike lewis

En primer lugar, recomiendo encarecidamente utilizar un perfilador o al menos usar cronométralo.

Sin embargo, si desea escribir su propio método de sincronización estrictamente para aprender, aquí hay un lugar para comenzar a usar un decorador.

Pitón 2:

def timing(f):
    def wrap(*args):
        time1 = time.time()
        ret = f(*args)
        time2 = time.time()
        print '%s function took %0.3f ms' % (f.func_name, (time2-time1)*1000.0)
        return ret
    return wrap

Y el uso es muy simple, solo use el decorador @timing:

@timing
def do_work():
  #code

Pitón 3:

def timing(f):
    def wrap(*args, **kwargs):
        time1 = time.time()
        ret = f(*args, **kwargs)
        time2 = time.time()
        print('{:s} function took {:.3f} ms'.format(f.__name__, (time2-time1)*1000.0))

        return ret
    return wrap

Nota que estoy llamando f.func_name para obtener el nombre de la función como una cadena (en Python 2), o f.__name__ en Phyton 3.

  • exactamente lo que quiero 🙂 … pero ustedes me convencieron de usar el generador de perfiles de python

    – Wazery

    29 mar. 11 a las 20:31

  • Parece que esto supone que time.time() informa el tiempo en microsegundos desde la época. La documentación dice que informa el tiempo en segundos. docs.python.org/2/library/time.html#time.time.

    – Rahul Jha

    13 dic. 14 a las 1:02

  • Esto no puede tener efecto, después de usar yield en func. ¿Cómo puedo seguir usando este método y puedo usar el rendimiento?

    – jiamo

    03 may. 15 en 12:05

  • def timing(f): def wrap(*args, **kwargs): time1 = time.time() ret = f(*args, **kwargs) time2 = time.time() print ‘La función %s tomó %0.3 f ms’ % (f.func_name, (time2-time1)*1000) return ret return wrap

    – Vivek Bagaria

    10 jul.

  • ¿Cuál es la desventaja de escribirlo usted mismo? ¿No es bastante simple almacenar una lista de tiempos transcurridos y examinar su distribución?

    – 3 hoyos

    17 ene.

Funcion de medida de tiempo de Python
Rayo

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 del decorador

Esto es casi lo mismo con el método de @Mike. Aquí agrego kwargs y functools envolver para hacerlo mejor.

def timeit(func):
    @functools.wraps(func)
    def new_func(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        elapsed_time = time.time() - start_time
        print('function [{}] finished in {} ms'.format(
            func.__name__, int(elapsed_time * 1_000)))
        return result
    return new_func

@timeit
def foobar():
    mike = Person()
    mike.think(30)

El método del administrador de contexto

from contextlib import contextmanager

@contextmanager
def timeit_context(name):
    start_time = time.time()
    yield
    elapsed_time = time.time() - start_time
    print('[{}] finished in {} ms'.format(name, int(elapsed_time * 1_000)))

Por ejemplo, puedes usarlo como:

with timeit_context('My profiling code'):
    mike = Person()
    mike.think()

Y el código dentro del with bloque será cronometrado.

Conclusión

Con 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 cómo convertirla en una función, puede elegir el segundo método.

Por ejemplo, ahora tienes

images = get_images()
big_image = ImagePacker.pack(images, width=4096)
drawer.draw(big_image)

Ahora quiere cronometrar el big_image = ... línea. Si lo cambias a una función, será:

images = get_images()
big_image = None
@timeit
def foobar():
    nonlocal big_image
    big_image = ImagePacker.pack(images, width=4096)
drawer.draw(big_image)

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í:

images = get_images()
with timeit_context('foobar'):
    big_image = ImagePacker.pack(images, width=4096)
drawer.draw(big_image)

  • Interesante aporte, sin embargo me parece inútil que en el método decorador que mencionas, tuviste que cambiar timeit interfaz y utilizar el wraps() función de la functools módulo. Quiero decir que todo ese código adicional no es necesario.

    – Billal Begueradj

    22 feb. 17 a las 08:20

  • Necesidades import functools

    – Guillaume Chevalier

    09 mar. 17 en 16:13


  • Tenga en cuenta que su decorador pierde el valor de retorno de la función original

    –Marc Van Daele

    13 dic. 17 en 11:27

  • Me gusta la idea de usar un contexto para el tiempo. Me pregunto si esto se puede extender para hacer un número definido de tiempos para las repeticiones. Intenté esto, pero no funciona: ` @contextmanager def timeit_context(name, repeats=1): startTime = time.time() for ind in range(repeats): yield elapsedTime = time.time() – startTime print( ‘[{}] terminado en {} ms’.format(nombre, tiempo transcurrido * 1000./repeticiones)) `

    – packoman

    21 oct.


1641974488 733 Funcion de medida de tiempo de Python
fani

No veo cuál es el problema con el timeit el módulo es. Esta es probablemente la forma más sencilla de hacerlo.

import timeit
timeit.timeit(a, number=1)

También es posible enviar argumentos a las funciones. Todo lo que necesita es envolver su 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 tiempo 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 te permite repetir el número de ejecuciones. Esto podría ser necesario porque otros procesos podrían interferir con su precisión de tiempo. Por lo tanto, debe ejecutarlo varias veces y buscar el valor más bajo.

  • ¿Enviar argumentos a la función usando envoltorios y decoradores? Por qué no timeit.timeit(lambda: func(a,b,c), number=1)? Lo uso cuando hago pruebas en una solución hipotética en una terminal.

    -Jacklynn

    03 abr.

Timeit tiene dos grandes fallas: no devuelve el valor de retorno de la función y usa eval, lo que requiere pasar un código de configuración adicional para las importaciones. Esto resuelve ambos problemas de manera simple y elegante:

def timed(f):
  start = time.time()
  ret = f()
  elapsed = time.time() - start
  return ret, elapsed

timed(lambda: database.foo.execute('select count(*) from source.apachelog'))
(<sqlalchemy.engine.result.ResultProxy object at 0x7fd6c20fc690>, 4.07547402381897)

Hay una herramienta fácil para medir el tiempo. https://github.com/RalphMao/PyTimer

Puede funcionar como un decorador:

from pytimer import Timer
@Timer(average=False)      
def matmul(a,b, times=100):
    for i in range(times):
        np.dot(a,b)        

Producción:

matmul:0.368434
matmul:2.839355

También puede funcionar como un temporizador enchufable con control de espacio de nombres (útil si lo está insertando en una función que tiene muchos códigos y puede llamarse en cualquier otro lugar).

timer = Timer()                                           
def any_function():                                       
    timer.start()                                         

    for i in range(10):                                   

        timer.reset()                                     
        np.dot(np.ones((100,1000)), np.zeros((1000,500)))
        timer.checkpoint('block1')                        

        np.dot(np.ones((100,1000)), np.zeros((1000,500)))
        np.dot(np.ones((100,1000)), np.zeros((1000,500)))
        timer.checkpoint('block2')                        
        np.dot(np.ones((100,1000)), np.zeros((1000,1000)))

    for j in range(20):                                   
        np.dot(np.ones((100,1000)), np.zeros((1000,500)))
    timer.summary()                                       

for i in range(2):                                        
    any_function()                                        

Producción:

========Timing Summary of Default Timer========
block2:0.065062
block1:0.032529
========Timing Summary of Default Timer========
block2:0.065838
block1:0.032891

Espero que ayude

1641974488 615 Funcion de medida de tiempo de Python
Attanasio alemán

Método Decorator usando la biblioteca Python Decorator:

import decorator

@decorator
def timing(func, *args, **kwargs):
    '''Function timing wrapper
        Example of using:
        ``@timing()``
    '''

    fn = '%s.%s' % (func.__module__, func.__name__)

    timer = Timer()
    with timer:
        ret = func(*args, **kwargs)

    log.info(u'%s - %0.3f sec' % (fn, timer.duration_in_seconds()))
    return ret

Ver publicación en mi Blog:

publicar en el blog mobilepro.pl

mi publicación en Google Plus

Funcion de medida de tiempo de Python
Adán Liu

Mi forma de hacerlo:

from time import time

def printTime(start):
    end = time()
    duration = end - start
    if duration < 60:
        return "used: " + str(round(duration, 2)) + "s."
    else:
        mins = int(duration / 60)
        secs = round(duration % 60, 2)
        if mins < 60:
            return "used: " + str(mins) + "m " + str(secs) + "s."
        else:
            hours = int(duration / 3600)
            mins = mins % 60
            return "used: " + str(hours) + "h " + str(mins) + "m " + str(secs) + "s."

Establecer una variable como start = time() antes de ejecutar la función/bucles, y printTime(start) justo después del bloque.

y obtuviste la respuesta.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad