[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