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

Xavier Noria fxnahashref.com
Diu Mar 12 02:51:21 PST 2006


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



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