Herramientas de optimizacion

Para poder medir el “performance” de un codigo frente a otro es necesario utilizar herramientas de medicion apropiada y los test apropiados.

Para este caso, utilizaremos el siguiente codigo:

from timeit import Timer
 
class Comparador:
    def __init__(self,cod1="",init1="",cod2="0",init2="",duration=500,veces=5):
        self.duration = duration
        self.veces = veces
        self.Functions = [None,None]
        self._setFunction(0,cod1,init1)
        self._setFunction(1,cod2,init2)
        self.resultados = []
        self.diferencias = []
        self.sum=0
        self.p1=0
        self.p2=0
        self.difProm = 0
 
    def _setFunction(self,n,c,i):
        self.Functions[n] = Timer(c,i)
 
    def startTest(self,times=100):
        self.resultados = []
        self.sum = 0
        self.testTimes = times
        for i in xrange(times):
            self.resultados.append([
                min(self.Functions[0].repeat(self.veces,self.duration)),
                min(self.Functions[1].repeat(self.veces,self.duration))
            ])
            self.diferencias.append(self.resultados[-1][0]-self.resultados[-1][1])
            self.sum+= self.diferencias[-1]
        self.difProm = self.sum/self.testTimes
        return self.difProm
 
    def HTest(self,Z=1.645, testee=False, times=100):
        """self.HTest(Z=1.645, testee=False, times=100)
Realiza el test de hipotesis:
    H0: u1-u2 = 0
    H1: u1-u2 > 0 (El codigo uno es mas lento que el codigo 2)
 
Si este test es True es porque hay evidencia estadistica para sugerir que el codigo 1 es mas lento que el codigo 2
        """
        if testee: self.startTest(times)
        self.s2 = sum((i - self.difProm)**2 for i in self.diferencias)/(self.testTimes-1)
        Z_ = self.difProm/(self.s2/self.testTimes)**0.5
        return Z_>=Z

Este código funciona sencillamente, supongamos que queremos comparar 'range' con 'xrange' y ver cual es mas lento. como toda la documentación de python señala que xrange es mas eficiente, y de hecho range actuara como xrange desde python 3k, haremos un test de contraste para ver cual es mas rápido.

Código 1

for i in range(1000):pass

Código 2

for i in xrange(1000):pass

entonces para probar hacemos:

>>> s = Comparador(cod1="for i in range(1000):pass",
                     cod2="for i in xrange(1000):pass")
>>> s.HTest(testee=True, times=20)
True

Esto básicamente nos dice: Existe evidencia estadistica para indicar que range es mas lento que xrange.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License