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.