lunes, febrero 27, 2006

Más sobre la función timeit


Por Alvaro en el foro python-es en respuesta a "¿El método que acabas de mostrar para medir tiempos se podría hacer con un conjunto de instrucciones y funciones?":

Si viejo. Por ejemplo


X="""
x=4
y=5
z=x*y
"""
from timeit import Timer

Print Timer(X).timeit()

Eso si... Si quieres evaluar el desempeño de una funcion, por ejemplo una
funcion cuadrado te recomiendo:

from timeit import Timer

x="cuadrado(5)"

y="""
def cuadrado(x):
return x*x
"""

print Timer(x,y).timeit()
Tambien podrias incluir dentro de la variable x la definición de la funcion.
Pero eso no seria muy inteligente ya que timeit tambien mediria cuanto se demora en definir la funcion, y eso no es lo que uno quiere.

Por ultimo la funcion timeit tiene un defecto. De que los datos que muestra no son los reales. Lo que hace la clase Timer es simplemente ejecuta una ves lo que le pases como 2do argumento y luego ejecuta un millon de veces (no me acuerdo si es un millon o solo mil veces) lo que le pases como primer argumento, sacando un promedio de cuanto se demoro cada ves que ejecuto el primer argumento. Pero el promedio que saca es cuando "se ejecutan el argumento muchas veces seguido" o dicho de otra forma, con gran estress. Asi que no hay que decir la funcion se demora en ejecutarce 0.55 seg, sino que hay que decir, bajo estress la funcion se demora 0.55 seg.


Para ser mas exactos es mejor no considerar a la funcion timeit como una funcion que mide el tiempo de ejecucion de algo, sino como algo que cuantifique el coste de ejecución de algo y que solo es valido cuando se compara con otra cosa (como por ejemplo cuando comparamos la ejecucion del len con distintos largos de string). Si esto se puede complementar con un

test de hipotesis de comparacion de medias, ideal....





No hay comentarios: