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

Enrique Nell perl_nellatelefonica.net
Diu Mar 19 07:12:57 PST 2006


Hola José Luis

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

Es cierto que esta versión del programa se ejecuta más rápido, pero es
equivalente al programa 
Awk, ya que no almacena los campos en un array, como los programas Perl y
Python. Si sólo
queremos contar los campos, la versión con tr que envié en el primer mensaje
es bastante más rápida. 
Por otra parte, en la documentación de Perl se recomienda no utilizar split
en contexto escalar.
La cuestión es la diferencia de velocidad entre Perl y Python al utilizar
split y almacenar los
trozos obtenidos en una matriz. De tu experimento llama la atención que al
eliminar la parte de 
almacenar en el array, los tiempos de las funciones split de Perl y Python
son bastante más parecidos
(y la versión Perl es más rápida). Ya comentaba Salva hace unos días que es
en la asignación del 
resultado de split donde está el problema en Perl.

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

También lo probé, con File::Slurp, pero como el archivo de prueba es
gordísimo la memoria virtual
de mi sistema se redujo a niveles poco conocidos:-)

Saludos
Enrique





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