[bcn-pm] Split: Perl vs. Python (vs. Awk?)

Enrique Nell perl_nellatelefonica.net
Dil Mar 13 05:33:55 PST 2006


Deberíais aliaros Salva y tú para crear el módulo Split::Faster:-) 
Por cierto, la reunión de Lisboa fue el jueves, no el martes (ya no sé en
qué día vivo...).

Os envío unos vínculos de artículos relacionados con el tema 
(aunque supongo que muchos de vosotros ya los habréis leído):

http://www.perl.com/lpt/a/2001/06/27/ctoperl.html
http://www.stonehenge.com/merlyn/UnixReview/col49.html

Haré experimentos con las funciones de cadena de Perl para ver si consigo
reducir un poco el tiempo.

Saludos,
Enrique


-----Original Message-----
From: barcelona-pm-bounces+perl_nell=telefonica.net en pm.org
[mailto:barcelona-pm-bounces+perl_nell=telefonica.net en pm.org] On Behalf Of
Xavier Noria
Sent: Sunday, March 12, 2006 11:51 AM
To: Barcelona Perl Mongers
Subject: Re: [bcn-pm] Split: Perl vs. Python (vs. Awk?)

On Mar 12, 2006, at 0:57, Enrique Nell wrote:

> Xavier Noria y Miguel estuvieron cacharreando un rato, y llegaron a la 
> conclusión de que la diferencia se debía a que la función split de 
> Python utiliza como argumento separador de campos una cadena en lugar 
> de una expresión regular.

Heh, bueno ese analisis fue un una cosa superficial ahi en el restaurante en
un rato, porque recuerdas que veia sospechosas las conclusiones.

Vi que en Python estaba usando str.split, en vez de re.split, y str.split
tiene pinta de ser mas eficiente porque puede asumir mas cosas (eso puede no
ser cierto, al final para hacer esto bien hay que
medir.)

El split de cadenas en Python se puede leer aqui (funcion string_split):

     http://tinyurl.com/jndpo

y parece que no usa el truco de las cadenas inmutables, ya que el bucle
principal llama a PyString_FromStringAndSize y a PyList_Append:

     while (i+n <= len) {
       if (s[i] == sub[0] && memcmp(s+i, sub, n) == 0) {
         if (maxsplit-- <= 0)
           break;
         item = PyString_FromStringAndSize(s+j, i-j);
         if (item == NULL)
           goto fail;
         err = PyList_Append(list, item);
         Py_DECREF(item);
         if (err < 0)
           goto fail;
         i = j = i + n;
       }
       else
         i++;
     }

El constructor PyString_FromStringAndSize parece que copia la cadena entera
en memoria nueva:

     op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size);
     if (op == NULL)
       return PyErr_NoMemory();
     PyObject_INIT_VAR(op, &PyString_Type, size);
     op->ob_shash = -1;
     op->ob_sstate = SSTATE_NOT_INTERNED;
     if (str != NULL)
       memcpy(op->ob_sval, str, size);
     op->ob_sval[size] = '\0';

PyList_Append hace lo normal, que es alocatar mas si hace falta y asignar al
final.

Yo seguiria investigando str.split versus re.split como conjetura.

-- fxn

_______________________________________________
llista dels Barcelona-pm
Barcelona-pm en pm.org
http://mail.pm.org/mailman/listinfo/barcelona-pm
BCN Perl Mongers: http://barcelona.pm.org




Més informació de la llista de correu Barcelona-pm