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

Jose Luis Perez Diez wjperezdagencat.net
Dil Mar 13 07:00:52 PST 2006


On Sunday 12 March 2006 00:57, Enrique Nell wrote:
> Hola mongers
>
> En la pasada edición de YAPC (en Braga), un Perl monger de Lisboa llamado
> Miguel Duarte presentó una Lightning Talk titulada "Perl is slow for
> processing delimited records and what I've done to improve it".
> Más tarde me pasó el código que había utilizado para llegar a sus
> conclusiones y me comentó que le extrañaba que
> los JAPH no hubieran respondido a la provocación.

> Así que descartamos Awk y no nos creemos lo de Java de momento, pero nos
> queda el dato inquietante:
> la función split de Python es mucho más rápida que la de Perl.


Ficheros originales 
gawk:  7 wallclock secs ( 0.00 usr  0.01 sys +  5.72 cusr  0.85 csys =  6.58 
CPU) @ 1000.00/s (n=10)
perl: 71 wallclock secs ( 0.00 usr  0.00 sys + 58.83 cusr  1.36 csys = 60.19 
CPU)
python: 28 wallclock secs ( 0.00 usr  0.00 sys + 24.53 cusr  1.00 csys = 25.53 
CPU)

con

cat <<EOF >field_count.pl
while(<>)
{
        \$field_count += split ':';
}

print "\$field_count\\n";
EOF


Me da
Benchmark: timing 10 iterations of gawk, perl, python...
gawk:  7 wallclock secs ( 0.00 usr  0.00 sys +  5.74 cusr  0.84 csys =  6.58 
CPU)
perl: 24 wallclock secs ( 0.00 usr  0.00 sys + 20.13 cusr  0.62 csys = 20.75 
CPU)
python: 28 wallclock secs ( 0.00 usr  0.00 sys + 24.75 cusr  1.00 csys = 25.75 
CPU)

> 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.

Creo que el codigo de perl es un poco mas rapido  si lo usas de la forma 
adecuada. La diferencia deve venir por como cada uno de ellos maneja los 
datos para hacerlos disponibles al programa. Modificando el python para que 
los datos no tengan necesidad de estar en extructuras accesibles por el 
programa :

cat <<EOF >field_count.py
import sys

s = sys.stdin.readline()
field_count = 0

while s:
        field_count += len(s.split(':'))
        s = sys.stdin.readline()

print field_count
EOF
gawk:  8 wallclock secs ( 0.00 usr  0.00 sys +  5.75 cusr  0.86 csys =  6.61 
CPU)
perl: 23 wallclock secs ( 0.00 usr  0.00 sys + 20.15 cusr  0.57 csys = 20.72 
CPU)
pthon: 33 wallclock secs ( 0.00 usr  0.00 sys + 24.75 cusr  1.06 csys = 25.81 
CPU)


> Mi pregunta es: ¿se os ocurre alguna forma de mejorar el rendimiento de
> Perl en esta tarea? (se supone que además de contar el número de campos,
> hay que almacenar los campos en una estructura de datos).

¿eer el fichero en una lista?


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