Calcular tiempo de ejecución



Versión: 2.x, 3.x

De forma estándar, Python permite medir el tiempo transcurrido durante la ejecución de un determinado código, a través del módulo timeit. Éste es útil en pequeñas proporciones y resulta muy fácil de implementar.

from timeit import timeit

print(timeit("'Hello, world!'.replace('Hello', 'Goodbye')"))

La función timeit.timeit requiere una porción de código Python en forma de cadena y la ejecuta, por defecto, 10.000 veces, y retorna el tiempo en segundos que ha tomado.

0.382205010985

Para indicar la cantidad de veces en la que es ejecutado, puede indicarse el parámetro number.

print(timeit("'Hello, world!'.replace('Hello', 'Goodbye')", number=500))

Imprime:

0.000206078515186

Números muy pequeños son representados con la notación científica.

>>> timeit("'Hello, world!'.replace('Hello', 'Goodbye')", number=1)
2.54867421608e-06

Haciendo uso del segundo parámetro setup, el código establecido en éste será ejecutado antes de iniciar la repetición.

timeit("'Hello, world!'.replace(target, replace_with)",
       "target = 'Hello'; replace_with = 'Goodbye'")

La herramienta puede también ser utilizada a través de la línea de comandos:

python -m timeit "'Hello, world!'.replace('Hello', 'Goodbye')"
1000000 loops, best of 3: 0.385 usec per loop


Para medir el tiempo transcurrido durante la ejecución de una función, el siguiente decorador, que hace uso de la función time.time, me ha resultado útil al momento de desarrollar.

from time import time

def count_elapsed_time(f):
    """
    Decorator.
    Execute the function and calculate the elapsed time.
    Print the result to the standard output.
    """
    def wrapper():
        # Start counting.
        start_time = time()
        # Take the original function's return value.
        ret = f()
        # Calculate the elapsed time.
        elapsed_time = time() - start_time
        print("Elapsed time: %0.10f seconds." % elapsed_time)
        return ret
    
    return wrapper

Ejemplo:

@count_elapsed_time
def test():
    for i in range(10000):
        "Hello, world!".replace("Hello", "Goodbye")

test()

Imprime:

Elapsed time: 0.0149998665 seconds.

En base a este código, puede implementarse en llamadas a funciones individuales.

def test():
    for i in range(10000):
        "Hello, world!".replace("Hello", "Goodbye")

start_time = time()
test()
elapsed_time = time() - start_time
print("Elapsed time: %.10f seconds." % elapsed_time)



Deja un comentario