¿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.
Respuestas:
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.
fuente
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.
fuente
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:
o
o incluso más simple
etc.
En Linux hay una serie de compiladores Fortran gratuitos. yo suelo
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.
fuente
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!
fuente
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.
fuente
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.
fuente