Python vs FORTRAN

17

¿Cuál es mejor: FORTRAN o Python? Y supongo que en ambos casos necesitas a Gnuplot, ¿estoy en lo cierto?

Estoy trabajando en una máquina con Windows en este momento.

Me gustaría usarlo para obtener soluciones numéricas para problemas de física, incluidas simulaciones de Monte-Carlo, integración y diferenciación numérica, dinámica molecular, etc.

Vi un curso sobre física computacional que presenta tanto FORTRAN (77 creo) como Python. Estoy planeando comenzar con uno y luego aprender el otro, pero no sé qué transición podría ser la más fácil.

¿Qué compiladores recomendarías también?

La pregunta básica para mí se reduce a: ¿cuál es el más fácil de aprender, cuál es el más rápido, cuál es más fácil de usar y, sobre todo, cuál es el más utilizado (entonces, una comparación de estos 4)? Y además de eso, ¿cuáles son los compiladores más comunes (gratuitos o de pago) en uso? Actualmente estoy considerando convertir una computadora portátil vieja (Intel dual core anterior) a Linux; Esperemos que sea lo suficientemente rápido.

Muchas gracias por las respuestas hasta ahora! Las respuestas que están en línea con lo que estoy buscando son las de LKlevin y SAAD.

Conozco los conceptos básicos de C ++, Maple y domino MATLAB y Mathematica9 casi por completo si eso es de alguna ayuda.

Mella
fuente
12
Realmente necesitas ser más específico; Esto es como preguntar "¿Qué es mejor: un martillo o un destornillador?". Eche un vistazo a scicomp.stackexchange.com/questions/11006 (se trata de C ++ en lugar de Fortran, pero la mayoría de los puntos deberían aplicarse por igual).
Christian Clason
@ChristianClason, punto justo: p
Nick
Gracias por su edición, aunque esto realmente no reduce las cosas. No estoy seguro de qué más se puede decir de lo que ya se da como respuesta a la pregunta vinculada anteriormente.
Christian Clason
2
Además, la pregunta sobre los compiladores es un tema separado y debería ser una pregunta separada. (De lo contrario, las personas familiarizadas con Fortran pero no interesadas en Python no lo verán). Algunas recomendaciones ya se encuentran en scicomp.stackexchange.com/questions/8617 .
Christian Clason
1
Si conoce matlab, puede aprender la mayoría de los algoritmos numéricos al implementarlos allí, aunque su rendimiento casi siempre será peor que las rutinas incorporadas de matlab. Desde allí, puede decidir cuáles son sus necesidades de rendimiento y pasar a una biblioteca / idioma más eficiente.
Godric Seer

Respuestas:

29

Facilidad de aprendizaje

Python y Fortran son lenguajes relativamente fáciles de aprender. Probablemente sea más fácil encontrar buenos materiales de aprendizaje de Python que buenos materiales de aprendizaje de Fortran porque Python se usa más ampliamente, y actualmente Fortran se considera un lenguaje "especializado" para la computación numérica.

Creo que la transición de Python a Fortran sería más fácil. Python es un lenguaje interpretado, por lo que la cantidad de pasos necesarios para ejecutar su primer programa es menor (abra el intérprete, escriba print("Hello, world!")en el indicador) que para Fortran (escriba un programa "Hola mundo", compile, ejecute). También creo que hay mejores materiales para enseñar estilo orientado a objetos en Python que en Fortran, y hay más código Python disponible en GitHub que el código Fortran.

Ponerse en marcha en Windows

Instalar Python debería ser menos doloroso; Hay distribuciones de Windows disponibles. Recomiendo usar una distribución científica como Anaconda o Enthought Canopy. No hay realmente un compilador, per se; El intérprete toma ese papel. Querrá usar un intérprete basado en CPython, porque hay más bibliotecas numéricas disponibles e interactúa muy bien con C, C ++ y Fortran. Otras implementaciones de intérpretes incluyen Jython y PyPy.

En una máquina con Windows, instalar un compilador Fortran será molesto. Los compiladores de línea de comandos típicos son programas como gfortran, ifort (de Intel; gratis para uso personal, de lo contrario cuesta dinero) y pgfortran (de PGI; versiones de prueba gratuitas, de lo contrario cuesta dinero). Para instalar estos compiladores, es posible que deba instalar algún tipo de capa de compatibilidad de tipo UNIX / POSIX, como Cygwin o MinGW. Me resultó difícil trabajar con él, pero a algunas personas les gusta ese flujo de trabajo. También podría instalar un compilador con una GUI, como Visual Fortran (nuevamente, tendría que pagar por una licencia).

En Linux, será más fácil instalar Python y compiladores; Todavía instalaría Anaconda o Enthought Canopy como una distribución de Python.

Velocidad: un equilibrio entre productividad y rendimiento

Al usar Python (o MATLAB, Mathematica, Maple o cualquier lenguaje interpretado), renuncia al rendimiento por productividad. En comparación con Fortran (o C ++, C o cualquier otro lenguaje compilado), escribirá menos líneas de código para realizar la misma tarea, lo que generalmente significa que le tomará menos tiempo obtener una solución que funcione.

La penalización de rendimiento efectiva por usar Python varía, y se mitiga delegando tareas computacionalmente intensivas en lenguajes compilados. MATLAB hace algo similar. Cuando haces una multiplicación matricial en MATLAB, llama a BLAS; la penalización de rendimiento es prácticamente cero, y no tuvo que escribir ningún Fortran, C o C ++ para obtener el alto rendimiento. Una situación similar existe en Python. Si puede usar bibliotecas (por ejemplo, NumPy, SciPy, petsc4py, dolfin de FEniCS, PyClaw), puede escribir todo su código en Python y obtener un buen rendimiento (una penalización de quizás 10-40%) porque todo el cálculo partes intensivas son llamadas a bibliotecas de idiomas compiladas rápidamente. Sin embargo, si escribiera todo en Python puro, la penalización de rendimiento sería un factor de 100-1000x. Entonces, si quería usar Python y tenía que incluir una costumbre, rutina computacionalmente intensiva, sería mejor escribir esa parte en un lenguaje compilado como C, C ++ o Fortran, luego envolverlo con una interfaz Python. Hay bibliotecas que facilitan este proceso (como Cython y f2py) y tutoriales para ayudarlo; generalmente no es oneroso.

Alcance de uso

Python se usa más ampliamente en general como lenguaje de propósito general. Fortran se limita en gran medida a la informática numérica y científica, y compite principalmente con C y C ++ para los usuarios de ese dominio.

En ciencia computacional, Python generalmente no compite directamente con lenguajes compilados debido a las penalizaciones de rendimiento que mencioné. Usaría Python para los casos en que desea una alta productividad y rendimiento es una consideración secundaria, como en la creación de prototipos de algoritmos numéricamente intensivos, procesamiento de datos y visualización. Usaría Fortran (u otro lenguaje compilado) cuando tenga una buena idea de cuál debería ser su algoritmo y diseño de aplicación, esté dispuesto a pasar más tiempo escribiendo y depurando su código, y el rendimiento es primordial. (Por ejemplo, el rendimiento es un paso limitante en su proceso de simulación, o es una entrega clave en su investigación.) Una estrategia común es mezclar Python y un lenguaje compilado (generalmente C o C ++, pero también se ha utilizado Fortran), y solo use el lenguaje compilado para las partes más sensibles al rendimiento del código; El costo de desarrollo es, por supuesto, que es más difícil escribir y depurar un programa en dos idiomas que un programa en un solo idioma.

En términos de paralelismo, el estándar MPI actual (MPI-3) tiene enlaces nativos Fortran y C. El estándar MPI-2 tenía enlaces C ++ nativos, pero MPI-3 no, y tendría que usar los enlaces C. Existen enlaces MPI de terceros, como mpi4py. He usado mpi4py; funciona bien y es fácil de usar. Para el paralelismo a gran escala (decenas de miles de núcleos), es probable que desee utilizar un lenguaje compilado porque cosas como cargar dinámicamente los módulos de Python lo morderán por el culo a escala si lo hace de una manera ingenua. Hay maneras de evitar ese cuello de botella, como lo demuestran los desarrolladores de PyClaw, pero es más sencillo evitarlo.

Opiniones personales

Tengo aproximadamente una década de experiencia en Fortran 90/95, y también he programado en Fortran 2003. Tengo aproximadamente cinco años de experiencia programando en Python. Uso Python mucho más de lo que uso Fortran porque, francamente, hago más cosas en Python. La mayoría del trabajo que necesito hacer no requiere recursos importantes de supercomputación y, por lo general, no vale la pena volver a desarrollarlo en otro idioma, por lo que Python está bien para resolver ODE y PDE. Si necesito usar un lenguaje compilado, usaré C, C ++ o Fortran, en ese orden.

La mayor parte del código de Fortran que he visto ha sido feo, principalmente porque la mayoría de la comunidad de la ciencia computacional parece desconocer o rechazar las mejores prácticas descubiertas por los ingenieros de software en los últimos 30 años. A saber: no existe un marco de pruebas de unidad buena en Fortran. (Lo mejor que encontré es FUnit, de la NASA, y eso ya no se mantiene.) Hay algunos buenos marcos de prueba de unidades Python, buenos generadores de documentación de Python y, en general, muchos mejores ejemplos de buenas prácticas de programación.

Geoff Oxberry
fuente
Muy buena y completa respuesta :). Ayer instalé Linux donde el compilador python ya estaba presente. Ahora me preguntaba si hay una manera fácil de compartir archivos entre mi máquina Linux y Windows. Noté que cada vez que uso un dispositivo para transferir datos, tanto la máquina Windows como Linux ignoran ciertas partes en stich (que está formateado en el formato NFTS).
Nick
y mi último problema se resuelve bij usando el formato FAT32 (al menos hasta ahora).
Nick
NB: FAT32 tiene un tamaño de archivo máximo limitado.
meawoppl
@Meawoppl, ¿hay alguna forma más conveniente de intercambiar archivos entre Linux y Windows? ¿Quizás Dropbox entonces? ¿Existe también una solución basada en hardware?
Nick
Mantenga sus archivos por debajo de 4GB: P Realmente, no sé de una buena solución. También hay cierta incertidumbre en las convenciones de nombre de archivo. Recuerdo que rompí el soporte de Windows una vez al nombrar un archivo <3.txt que puso a M $ bastante triste. El soporte NTFS en Linux es bastante bueno ahora, pero es notablemente un no-go total en OSX. Realmente pensé que ya habríamos resuelto este problema.
meawoppl
7

Me mantendría alejado de Fortan, o si es necesario, use una versión razonablemente nueva (2003 en lugar de 77). Una gran cantidad de software de física (simulaciones de Monte Carlo en particular) está escrita en Fortran, simplemente porque los proyectos se iniciaron originalmente en los años 80.

Dicho esto, python y Fortran son dos idiomas muy diferentes, y para lo que deberían usarse es bastante diferente. Python es de alto nivel y, en general, no tan rápido (en comparación con Fortran y C ++). La razón por la que se usa tanto es porque es lo suficientemente rápido para la mayoría de las cosas y tiene excelentes bibliotecas (con tecnología Fortran) para muchas (pero no todas) de las cosas que le gustaría hacer. También tiene el excelente Matplotlib para trazar (por lo que no es necesario para GNUplot) y puede obtener un rendimiento bastante decente utilizando cosas como Cython para escribir los bits caros. Sin embargo, no será tan rápido como Fortran o C ++, y la paralelización es bastante terrible, lo que la hace inadecuada para la computación numérica de alto rendimiento. Sin embargo, si puede manejar lo que desea llamando a las bibliotecas Fortran o C,

Fortran es un lenguaje de nivel algo inferior. Para los números, el soporte de la biblioteca es sorprendentemente bueno, pero sigue siendo de un nivel muy bajo, lo que le brinda un montón de errores que de otro modo podría evitar, como pasar accidentalmente el tamaño de matriz incorrecto a un método. Estos errores son difíciles de encontrar y es posible que no los notes en absoluto. Confía en mí, pasé bastante tiempo escribiendo Fortran 77.

C ++ es (en mi humilde opinión) un medio feliz. Con bibliotecas como Armadillo o Eigen, puede salirse con la suya con un estilo de codificación de nivel bastante alto mientras obtiene un estilo de rendimiento de bajo nivel.

Hablando de rendimiento, la única opción real para Python numérico en este momento es CPython. Si descarga algo como WinPython , también obtendrá la mayoría de las bibliotecas que necesita.

Para Fortran en Windows, las cosas son un poco más difíciles. Recomendaría cambiar a Linux y usar el compilador ifort gfortran o Intels. Ifort tiende a ser más rápido para el código numérico en mi experiencia, pero solo es gratis para uso no comercial y no académico.

En resumen: a menos que desee ejecutar simulaciones realmente pesadas, Python es, con mucho, la opción más fácil y mucho más agradable para trabajar. También debe ser lo suficientemente rápido para la mayoría de los proyectos a nivel de estudiantes. Si necesita un mejor rendimiento, comience mirando las cantidades de bibliotecas ya desperdiciadas y deje que eso decida su idioma. Si tiene que escribir cosas desde cero, use C ++.

También una advertencia: la mayoría del código escrito por los físicos es bastante terrible, presumiblemente porque los físicos tienden a asumir que la programación es fácil y no requiere el mismo rigor que podrían usar en matemáticas. Considera tomar una clase o comprar un libro que enseñe programación.

Descargo de responsabilidad: soy un físico que ha pasado bastante tiempo con los códigos Monte Carlo basados ​​en Fortran 77 y actualmente realiza todo su procesamiento de datos en Python.

LKlevin
fuente
Con respecto a la paralelización, los investigadores han usado Python en paralelo con éxito en decenas de miles de núcleos con buena eficiencia paralela. (Por ejemplo, PyClaw se ha ejecutado en todo Shaheen, que tiene más de 65,000 núcleos).
Geoff Oxberry
1
Bueno, es posible, pero que yo sepa, solo asegurándome de que la parte paralela ocurre fuera de CPython, lo cual es un esfuerzo considerable. La parte paralela de PyClaw (PETSc) está escrita en C, por ejemplo. Otra alternativa es ejecutar múltiples instancias de CPython, pero no es exactamente trivial.
LKlevin
La mayoría de las aplicaciones paralelas no son triviales. Usted escribió "La paralelización [de Python] es bastante terrible, lo que la hace inadecuada para la computación numérica de alto rendimiento". Nadie escribe ningún código de alto rendimiento en Python puro. El razonamiento de esta decisión no tiene nada que ver con el paralelismo, y no invalida el uso de Python como lenguaje de interfaz en computación de alto rendimiento, siempre que se use de manera adecuada. Su cita es un hombre de paja que combina los problemas de paralelismo, alto rendimiento e idiomas interpretados; nadie competente diseñaría una aplicación como esa.
Geoff Oxberry
Estoy de acuerdo en que Python es un excelente lenguaje de interfaz para casi cualquier propósito, pero eso se aleja de la pregunta. La mayoría de las aplicaciones no son triviales, el problema aquí es que todos los casos de paralelización, incluidos los triviales, no son triviales en python. Esto puede ser una molestia si su problema está bien descrito en términos de operaciones de Numpy o Cython. No, no usaría esto en un clúster de 65000 núcleos, pero podría aceptar el doble de rendimiento en un núcleo de 100.
LKlevin
Paralelismo Wrt, lo bueno de Fortran es que además de MPI / OpenMP también hay Co-arrays que ahora son parte del estándar. Por ejemplo, mira esto jolts.stanford.edu/72/…
stali
7

Python es un lenguaje muy lento y de alto nivel. Para un rápido cálculo de números, tendrá que escribir los núcleos de cómputo principales en lenguajes de bajo nivel como C / C ++, lo que significa que ahora tiene que aprender no uno, sino al menos dos idiomas. También tendrá que lidiar con dolores de cabeza adicionales asociados con la depuración / instalación / mantenimiento, etc. La mayoría de las personas usan Python como un azúcar sintáctico para ocultar las deficiencias de C / C ++.

Modern Fortran (90 y posterior) es rápido y de alto nivel con una sintaxis similar a MATLAB. Entonces puedes hacer cosas como:

k=k+matmul(transpose(B),matmul(D,B))*weight(i)*detj

o

indx(:)=indxmap(indx(:),2)

o incluso más simple

indx=indxmap(indx,2)

etc.

En Linux hay una serie de compiladores Fortran gratuitos. yo suelo

  1. CCG
  2. Estudio Solaris
  3. Open64
  4. Intel (solo para uso no comercial)

No uso Macs / OSX pero hay PGI gratis.

Y no use FORTRAN 77. Nadie lo usa para escribir código nuevo.

Descargo de responsabilidad: personalmente miré a Python para escribir mi propio código FE no estructurado (construido sobre PETSc), pero la cantidad de trabajo / codificación involucrada fue más que escribirlo simplemente Fortran 95.

stali
fuente
1
A esto añadiría que puedes hacer una programación orientada a objetos bastante seria en Fortran 2003; ver por ejemplo esta guía . He estado usando mucho en mi propio código y ha sido muy eficaz para lo que yo quiero hacer. Mucha gente le dirá que lo evite. Le digo que tenga una mente abierta, puede que le guste mucho. Ciertamente lo hago.
Daniel Shapero
4

Python es muy práctico para el análisis de simulación completo con paquetes versátiles bien documentados: generación de cuadrícula, cálculo de matriz y manejo de estructura de datos ( numpy y pandas ), así como visualización de datos con matplotlib. Para simulaciones complejas con grandes archivos de resultados, es aún mejor trabajar con el paquete VTK que permite exportar datos para ser leídos por aplicaciones avanzadas de código abierto (como Paraview o Visit)

Fortran ha sido durante algún tiempo el idioma preferido para diferentes dominios en simulaciones. Es fácilmente legible (aunque menos legible que el código Python). El manejo de la matriz es uno de los puntos fuertes del lenguaje, bastante fácil de definir y usar en uso para todo tipo de operaciones de matriz. Es útil cuando se depura también.

La comparación se reduce al rendimiento : solo he realizado cálculos a gran escala utilizando lenguajes compilados (C ++ y Fortran 90), pero nunca con Python. Otro hilo proporciona más información sobre el rendimiento de los idiomas interpretados y compilados: ¿Qué idioma debo usar al enseñar un curso de pregrado en programación de computadoras?

Personalmente, me gusta trabajar con Python en general, especialmente para el procesamiento posterior. ¡La programación en Python es divertida!

SAAD
fuente
1
El rendimiento es casi siempre importante. La falta de atención al rendimiento es la razón por la cual las personas necesitan 8 núcleos con 16 Gb de RAM para revisar el correo electrónico y navegar por la web.
stali
He tenido la mala suerte de tener que leer el código Python de los demás. No clasificaría el código py como fácil de leer.
Biswajit Banerjee
@stali: Estoy totalmente de acuerdo
SAAD
1
@BiswajitBanerjee: no es imposible escribir código complicado con ningún idioma, pero al menos puedo identificar fácilmente las entradas y salidas de cualquier función, ¡aquí es donde Fortran se vuelve horrible! :)
SAAD
3

Con Python no necesita Gnuplot, puede usar, por ejemplo, matplotlib y / o usar el shell de IPython. IPython es un shell interactivo de Python que, en modo% pylab, proporciona prácticamente los mismos comandos de trazado que tiene disponibles en MATLAB.

Es muy probable que la computación científica cambie en gran medida de MATLAB a Python en los próximos 5 años o más.

jolvi
fuente
Una ventaja de Gnuplot es que casi siempre se instala en máquinas Linux (clúster / servidores, etc.) y es muy útil para una visualización rápida / sucia. Es como vi para viz.
stall
1

Seguiría usando MATLAB, llama a bibliotecas de matemáticas rápidas, y no verá mucha diferencia en el rendimiento al cambiar a FORTRAN en Windows. Al mismo tiempo, usted tendrá una mejor infraestructura en MATLAB para informar de los resultados y el funcionamiento de su código. La desventaja de MATLAB es su costo. FORTRAN es básicamente gratuito, y hay un montón de bibliotecas gratuitas por ahí.

FORTRAN es muy fácil de aprender y empezar a programar en Básicamente hace lo que su nombre indica:. Traduce sus fórmulas en código, que es fácil de leer y entender. Es por eso que los físicos lo usaban mucho en los viejos tiempos. Mientras la mayor parte de su código se trata de resolver problemas de física (no construcción de interfaces gráficas de usuario o haciendo otras cosas interesantes), FORTRAN será fácil de mantener.

Recomendaría Python solo si te gusta la programación. Piense en esto: cuando codifica una solución a un problema de física, ¿le gusta programar parte de la solución? Si lo hace, entonces Python es una opción, porque el lenguaje es mucho mejor que el de MATLAB.

Aksakal
fuente
2
Su declaración sobre las diferencias de rendimiento al cambiar de MATLAB a Fortran no es cierta en general. Fortran es excelente si está escribiendo código para el que las matrices son una estructura de datos naturalmente buena, si puede vivir con la forma en que maneja las E / S y si tiene las bibliotecas que necesita. Las bibliotecas numéricas en Python se superponen en gran medida en la funcionalidad con MATLAB, y me resulta más fácil escribir interfaces Python en código C que las interfaces MATLAB en código C.
Geoff Oxberry
A veces uno no ve mucha diferencia. Recientemente reescribí un programa de simulación física de Matlab (usando el paquete bvp6c internamente) a Fortran 2008 (usando el paquete bvp_solver internamente), y el tiempo de ejecución bajó a solo 1.4% después del cambio, aunque no cambié los algoritmos o estructura general del programa. Para una simulación que solía requerir ~ 3.5 días por punto de datos para converger, esta fue una mejora muy notable.
jabirali