Python vs C, interpretado vs compilado, etc.

Inigo Aldazabal Mensa inigo_aldazabal en ehu.es
Jue Ene 15 17:00:41 CET 2009


El Jueves, 15 de Enero de 2009 15:02, Vicent escribió:
> Hola a todos.
>
> Soy todavía nuevo en Python. Pretendo utilizarlo para programar
> algoritmos científicos, con gran intensidad de cálculos, etc. Tengo
> claro que utilizaría numPy, SciPy y, en general, otros módulos
> recomendados dentro del ámbito científico (en concreto, me parece muy
> interesante la distribución Python(x,y)).
>

No conocía, Python(x,y) pero para windows parece interesante: tiene justo 
lo que suelo instalar en linux para estos menesteres, y alguna cosa mas.


> Pero...
>
> Frente a lenguajes como C, dentro del ámbito científico, Python parece
> estar en desventaja (dicen), en el momento de la EJECUCIÓN. ¿Es así?
>
> [Hablo del momento de la ejecución, ya que probablemente sea más
> "bonito", agradable, fácil, rápido, eficiente, etc. escribir y leer
> código en Python que en C.]

Respecto a la velocidad de ejecución, efectivamente es mucho mas lento, 
peeero la cuestión es que normalmente en el cálculo científico casi todo 
el peso de la ejecución lo lleva una parte muy concreta del código. Como 
esa parte normalmente la va a realizar alguna rutina, bien tuya o bien de 
librería, es esa parte solo la que tienes que programar en C (o llamar 
directamente a la librería).

Por ejemplo, en física, imagina que quieres calcular los autoestados de un 
pozo unidimensional arbitrario. Al final lo que tienes que hacer es 
diagonalizar una matriz. Pues bien, haces todo en python y en el momento 
en el que vas a diagonalizar la matriz, llamas a la rutina correspondiente 
de lapack y... el programa tarda lo mismo que si  lo haces en C (o 
fortran), porque pasa el 99% del tiempo diagonalizando (por ejemplo, unos 
minutos frente a algún segundo el resto), y la rutina que lo hace es 
exactamente la misma, la de lapack que habrías llamado desde C. El resto 
del programa claro es mucho mas sencillo y legible: la inicialización o 
lectura del potencial, la creación de la matriz, la salida de resultados, 
etc.

En resumen, haz en python todo lo que puedas que no calcula realmente, y la 
parte intensiva haces un "binding" y lo llamas desde python. O incluso 
haces tú tu rutina en C que llama a las librerías correspondientes (eg un 
bucle que llama a FFT 1000) veces y haces el binding a tu rutina 
(i.e. "modulo"). Así que si quieres rapidez de C o fortran no te vas a 
olvidar (pero casi ;-).

Unos ejemplos de cómo se puede optimizar aquí: 
http://www.scipy.org/PerformanceTips

Un saludo
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es