Fundamentos de Temporización y Evaluación Comparativa
Dado que no se enfatiza el análisis de la complejidad temporal en este curso, se dará prioridad a los métodos empíricos (prácticos) para medir el rendimiento real del código. Una de las formas más sencillas de medir el rendimiento de un fragmento de código es utilizando la función incorporada time.time().
Esta función devuelve el tiempo actual en segundos desde la época (el punto de referencia del sistema para el tiempo). Al llamar a time.time() antes y después de un bloque de código, se puede calcular la diferencia para ver cuánto tiempo tarda en ejecutarse.
123456789101112131415import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
Aunque el uso de time.time() es sencillo y efectivo para estimaciones aproximadas, presenta varias limitaciones:
- Baja resolución: la precisión de
time.time()puede variar según el sistema operativo, lo que conduce a resultados inexactos para operaciones pequeñas; - Sobrecarga: incluye otros procesos del sistema que se ejecutan en segundo plano, lo que puede distorsionar la medición;
- No repite: para obtener mediciones más precisas, a menudo es necesario ejecutar el mismo código varias veces para obtener un resultado promedio, algo que
time.time()no gestiona automáticamente.
Ventajas de usar timeit
El módulo timeit es una herramienta más avanzada diseñada para superar las limitaciones de time.time() y proporcionar una forma confiable de medir el tiempo de ejecución de pequeños fragmentos de código, a menudo denominado micro-benchmarking.
Las principales ventajas de timeit son:
-
Alta precisión:
timeitutilizatime.perf_counter()internamente, un temporizador de alta resolución que incluye el tiempo dedicado durante el sueño y la espera de E/S, lo que lo hace más preciso para intervalos cortos quetime.time(); -
Repetición automática:
timeitejecuta automáticamente el código varias veces y calcula el tiempo de ejecución promedio. Esto ayuda a mitigar los efectos de los procesos en segundo plano, proporcionando una medida más confiable del rendimiento del código; -
Sobrecarga mínima:
timeitestá diseñado para ejecutarse en un entorno limpio, deshabilitando temporalmente la recolección de basura para asegurar que las mediciones se centren en el código evaluado sin interferencias de las operaciones de gestión de memoria.
1234567import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
En este ejemplo, timeit.timeit() ejecuta el código especificado como una cadena (variable code_snippet) 30 veces (especificado por el parámetro number) y devuelve el tiempo total de ejecución para las 30 ejecuciones. Al dividir el tiempo total por el número de iteraciones (30), se puede calcular el tiempo de ejecución promedio para una sola ejecución.
Elección del Número de Iteraciones
La elección del número de iteraciones depende de la complejidad del código que se está evaluando y la precisión requerida en los resultados de tiempo. Ejecutar el código con diferentes cantidades de iteraciones permite evaluar la estabilidad de los resultados; si los tiempos de ejecución son consistentes, probablemente se ha encontrado un número óptimo de iteraciones.
Para fragmentos de código muy rápidos (milisegundos o menos), se recomienda realizar más de 1000 iteraciones para obtener promedios confiables. Para código de duración moderada (algunos milisegundos a segundos), 100 a 500 iteraciones suelen ser suficientes. Para código de ejecución prolongada (varios segundos o más), 10 a 50 iteraciones normalmente proporcionan un buen equilibrio entre precisión y tiempo dedicado a la evaluación.
1. ¿Qué función proporciona alta precisión y ejecuta automáticamente el código varias veces para calcular un tiempo de ejecución promedio?
2. ¿Por qué el uso de time.time() para medir el rendimiento puede ser menos confiable que timeit.timeit()?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Genial!
Completion tasa mejorada a 7.69
Fundamentos de Temporización y Evaluación Comparativa
Desliza para mostrar el menú
Dado que no se enfatiza el análisis de la complejidad temporal en este curso, se dará prioridad a los métodos empíricos (prácticos) para medir el rendimiento real del código. Una de las formas más sencillas de medir el rendimiento de un fragmento de código es utilizando la función incorporada time.time().
Esta función devuelve el tiempo actual en segundos desde la época (el punto de referencia del sistema para el tiempo). Al llamar a time.time() antes y después de un bloque de código, se puede calcular la diferencia para ver cuánto tiempo tarda en ejecutarse.
123456789101112131415import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
Aunque el uso de time.time() es sencillo y efectivo para estimaciones aproximadas, presenta varias limitaciones:
- Baja resolución: la precisión de
time.time()puede variar según el sistema operativo, lo que conduce a resultados inexactos para operaciones pequeñas; - Sobrecarga: incluye otros procesos del sistema que se ejecutan en segundo plano, lo que puede distorsionar la medición;
- No repite: para obtener mediciones más precisas, a menudo es necesario ejecutar el mismo código varias veces para obtener un resultado promedio, algo que
time.time()no gestiona automáticamente.
Ventajas de usar timeit
El módulo timeit es una herramienta más avanzada diseñada para superar las limitaciones de time.time() y proporcionar una forma confiable de medir el tiempo de ejecución de pequeños fragmentos de código, a menudo denominado micro-benchmarking.
Las principales ventajas de timeit son:
-
Alta precisión:
timeitutilizatime.perf_counter()internamente, un temporizador de alta resolución que incluye el tiempo dedicado durante el sueño y la espera de E/S, lo que lo hace más preciso para intervalos cortos quetime.time(); -
Repetición automática:
timeitejecuta automáticamente el código varias veces y calcula el tiempo de ejecución promedio. Esto ayuda a mitigar los efectos de los procesos en segundo plano, proporcionando una medida más confiable del rendimiento del código; -
Sobrecarga mínima:
timeitestá diseñado para ejecutarse en un entorno limpio, deshabilitando temporalmente la recolección de basura para asegurar que las mediciones se centren en el código evaluado sin interferencias de las operaciones de gestión de memoria.
1234567import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
En este ejemplo, timeit.timeit() ejecuta el código especificado como una cadena (variable code_snippet) 30 veces (especificado por el parámetro number) y devuelve el tiempo total de ejecución para las 30 ejecuciones. Al dividir el tiempo total por el número de iteraciones (30), se puede calcular el tiempo de ejecución promedio para una sola ejecución.
Elección del Número de Iteraciones
La elección del número de iteraciones depende de la complejidad del código que se está evaluando y la precisión requerida en los resultados de tiempo. Ejecutar el código con diferentes cantidades de iteraciones permite evaluar la estabilidad de los resultados; si los tiempos de ejecución son consistentes, probablemente se ha encontrado un número óptimo de iteraciones.
Para fragmentos de código muy rápidos (milisegundos o menos), se recomienda realizar más de 1000 iteraciones para obtener promedios confiables. Para código de duración moderada (algunos milisegundos a segundos), 100 a 500 iteraciones suelen ser suficientes. Para código de ejecución prolongada (varios segundos o más), 10 a 50 iteraciones normalmente proporcionan un buen equilibrio entre precisión y tiempo dedicado a la evaluación.
1. ¿Qué función proporciona alta precisión y ejecuta automáticamente el código varias veces para calcular un tiempo de ejecución promedio?
2. ¿Por qué el uso de time.time() para medir el rendimiento puede ser menos confiable que timeit.timeit()?
¡Gracias por tus comentarios!