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

Enrique Nell perl_nellatelefonica.net
Dis Mar 11 15:57:04 PST 2006


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.
Este "kit de pruebas", que os envío adjunto, contiene un programa
(denominado generate.pl) que genera un fichero de valores numéricos
aleatorios separados por ":", versiones en Perl, Python y Awk de un programa
para contar el número 
de campos, y otro programa (denominado run_benchmark.pl) que mide los
tiempos de ejecución de las versiones anteriores.
En la presentación, Miguel afirmó que la versión Java también tardaba menos
en ejecutarse que la versión Perl. 
Quedó en copiar el código Java en la página de YAPC::2005, pero aún no lo ha
hecho (creo que necesitaba permiso de su
empresa para hacerlo).
 
Hace unos días vi en perl.com que los perl mongers de Lisboa iban a celebrar
una reunión el martes pasado y que Miguel volvía a la carga con otra
presentación titulada "When not to choose Perl". Otros mongers del grupo
amenazaron con 
recurrir a la violencia física para hacerle entrar en razón, pero no creo
que hayan tenido éxito. Aunque sea monger y 
la crítica sea constructiva, creo que ha sido abducido por el mundo Java:-)
De todos modos, eso me hizo recordar la charla de Braga, así que
"desempolvé" el código que me pasó y me puse a hacer pruebas en la siguiente
plataforma:
 
Pentium Centrino a 1,3 GHz, 512 MB de RAM
Mandrake Linux 10.1 con Perl 5.8.5, Python 2.3.4, GNU Awk 3.1.3
Windows XP con Perl 5.8.7, Python 2.4.2, GNU Awk 3.0.4   
 
Los resultados:
En Windows XP: Perl - 80 seg., Python - 16 seg., GNU Awk - 10 seg.
En Linux:      Perl - 46 seg., Python - 18 seg., GNU Awk -  3 seg.
 
Conclusiones
============
Diferencias entre sistemas operativos:
- La ejecución del programa Awk en Windows XP tarda más del doble que en
Linux.
- La ejecución del programa Perl en Windows XP tarda casi el doble que en
Linux.
- La ejecución del programa Python en Windows XP es un poco más rápida que
en Linux 
(pero hay que tener en cuenta que la versión de Python que tengo instalada
en Windows es más reciente).
- Debería dejar de utilizar Windows (o empezar a utilizar Python en
Windows):-)

Diferencias entre lenguajes:
Sobre la velocidad de Awk: igual me equivoco (porque nunca he programado en
Awk), pero creo que el programa Awk no almacena los campos (simplemente
cuenta el número de campos), con lo cual no es equivalente a los programas
Perl y Python, que sí los almacenan. En Perl se puede conseguir el mismo
resultado con estas líneas (que tardan prácticamente lo mismo que el
programa Awk):
 
$field_count += (($_ =~ tr/:/:/) + 1) while (<>);

print "$field_count\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.

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.

Si los campos fueran de ancho fijo, podríamos intentar utilizar unpack para
obtener mejores resultados, pero no es 
el caso.
 
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).
 
Saludos
Enrique

------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : _test_kit.zip
Tipo       : application/x-zip-compressed
Tamaño     : 1302 bytes
Descripción: no disponible
Url        : http://mail.pm.org/pipermail/barcelona-pm/attachments/20060311/cd1267d2/_test_kit.bin


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