Concatenación lenta.

Francesc Alted falted en pytables.org
Mar Jun 1 14:08:01 CEST 2004


Si precisas velocidad, te recomiendo que pruebes con psyco [1]. Es muy fácil
de usar y para este caso concreto va muy bien.

Mira este penqueño ejemplo:

-----------------------------------------------
from time import time
import psyco

def test1():
	buffer = ""
	for x in xrange(65535):
		buffer+="FF"

def test2():
	buffer=""
	ls=[]
	for x in xrange(65535):
		ls.append("FF")
	buffer="".join(ls)

t1=time()
test1()
print "tiempo test1 -->", time()-t1
psyco.bind(test1)
t1=time()
test1()
print "tiempo test1 (usando pysco) -->", time()-t1
t1=time()
test2()
print "tiempo test2 -->", time()-t1
psyco.bind(test2)
t1=time()
test2()
print "tiempo test2 (usando pysco) -->", time()-t1
-----------------------------------------------------

y el output:
tiempo test1 --> 1.80702400208
tiempo test1 (usando pysco) --> 0.00537300109863
tiempo test2 --> 0.078635931015
tiempo test2 (usando pysco) --> 0.0402929782867

o sea, la primera aproximación es muy lenta sin psyco, pero la más rápida
con él (casi un factor 10 más que la segunda).

El primer caso es tan rápido en psyco porque su autor (Armin Rigo) hizo una
optimización especial para ese caso (de su web):

"""
And I have rewritten the string concatenation implementation, as the
previous one was unexpectedly inefficient: now using 's=s+t' repeatedly to
build a large string is at least as efficient as filling a cStringIO object
(and more memory-conservative than using a large list of small strings and
calling '"".join()' at the end).
"""

[1] http://psyco.sourceforge.net/

Saludos,

Francesc


A Dimarts 01 Juny 2004 13:30, Pepe Aracil va escriure:
> 
> Hola.
> 
> Tengo un problemilla con la velocidad de concatenación.
> 
> Por Ej.
> ---
> buffer = ""
> for x in xrange(65535):
> 	buffer+="FF"
> ---
> 
> Esto es lentiiiiisimo. Supongo que es porque al ser un objeto inmutable, 
> necesita crearlo cada vez.
> 
> He probado con el join de esta manera
> 
> -----
> buffer=""
> ls=[]
> for x in xrange(65535):
> 	ls.append("FF")
> buffer="".join(ls)
> -----
> 
> Este segundo ejemplo es mucho más rápido, pero ¿Es la forma más rápida de 
> componer una cadena a partir de cadenas más pequeñas?
> 
> Necesito saber el método más rápido porque tengo que transformar ficheros 
> relativamente grandes a cadenas con su contenido en hexadecimal.
> 
> 
> Gracias.
> 
> 
> 
> 
> 
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
> 
> 

-- 
Francesc Alted




Más información sobre la lista de distribución Python-es