miércoles, septiembre 07, 2005

Optimizaciones en python


Me han pasado hoy un extracto del libro 'Python in a Nutshell', sobre optimizaciones.
Hay sobre todo dos que son muy interesantes:

Expandiendo Listas
Es posible mejorar el rendimiento si sabemos a priori el tamaño que va a alcanzar la lista, reservando el espacio de la siguiente manera, result=[None]*N. Posteriormente accederemos a cada posición con el operador [].

Expandiendo Cadenas
La idea es en lugar de hacer appends, ir metiendo los elementos en una lista y luego pasarlos a la cadena.

big_string = ''.join(temp_list)

Indican también otra forma O(N) de crear cadenas concatenando las piezas a una instancia de un array.array('c'), o escribiendo las piezas a una instancia de cStringIO.StringIO.

Otra optimización, pero menos importante es hacer uso del operador %. Ejemplo:

oneway = str(x)+' eggs and '+str(y)+' slices of '+k+' ham'
another = '%s eggs and %s slices of %s ham' % (x, y, k)

Pruebas
He estado haciendo unas pruebas sobre las difefentes formas de concatenar cadenas:



from time import time
tini = time()

#----- 0.016
#s = ''
#for i in range(10000):
# s += ' '
#----- 0.006
#l = []
#for i in range(10000):
# l.append(' ')
#s = ''.join(l)
#----- 0.004
#l = [None] * 10000
#for i in range(10000):
# l[i] = ' '
#s = ''.join(l)
#----- 0.007
#import array
#a = array.array('c')
#for i in range(10000):
# a.append(' ')
#s = str(a)
#----- 0.008
#import cStringIO
#io = cStringIO.StringIO()
#for i in range(10000):
# io.write(' ')
#io.seek(0)
#s = io.read()
#----- 0.021
#x = "1"
#y = "2"
#k = "3"
#for i in range(10000):
# oneway = str(x)+' eggs and '+str(y)+' slices of '+k+' ham'
#----- 0.011
#x = "1"
#y = "2"
#k = "3"
#for i in range(10000):
# another = '%s eggs and %s slices of %s ham' % (x, y, k)
#-----

tfin = time()

print (tfin - tini)





No hay comentarios: