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