Python vs FORTRAN

17

Lequel est le meilleur: FORTRAN ou Python? Et je suppose que dans les deux cas, vous avez besoin de Gnuplot, ai-je raison?

Je travaille actuellement sur une machine Windows.

J'aimerais l'utiliser pour obtenir des solutions numériques pour des problèmes de physique, y compris des simulations Monte-Carlo, l'intégration et la différenciation numériques, la dynamique moléculaire, etc.

J'ai vu un cours sur la physique computationnelle qui présente à la fois FORTRAN (77 je crois) et Python. Je prévois de commencer par l'un puis d'apprendre l'autre, mais je ne sais pas quelle transition pourrait être la plus facile.

Quels compilateurs recommanderiez-vous également?

La question fondamentale pour moi se résume à: laquelle est la plus facile à apprendre, laquelle est la plus rapide, laquelle est la plus conviviale et surtout laquelle est la plus utilisée (donc une comparaison de ces 4)? Et à côté de cela, quels sont les compilateurs les plus courants (gratuits ou payants) utilisés? J'envisage actuellement de convertir un vieux portable (ancien Intel dual core) en Linux; j'espère que c'est assez rapide.

Merci beaucoup pour les réponses jusqu'à présent! Les réponses qui correspondent à ce que je recherche sont celles de LKlevin et SAAD.

Je connais les bases de C ++, Maple et je maîtrise presque complètement MATLAB et Mathematica9 si cela peut vous aider.

pseudo
la source
12
Vous devez vraiment être plus précis; c'est comme demander "quel est le meilleur: un marteau ou un tournevis?". Jetez un œil à scicomp.stackexchange.com/questions/11006 (il s'agit de C ++ au lieu de Fortran, mais la plupart des points devraient s'appliquer également).
Christian Clason
@ChristianClason, juste point: p
Nick
Merci pour votre montage, bien que cela ne limite pas vraiment les choses. Je ne sais pas quoi dire de plus que ce qui est déjà donné comme réponses à la question liée ci-dessus.
Christian Clason
2
En outre, la question sur les compilateurs est un problème distinct et devrait être une question distincte. (Sinon, les personnes familières avec Fortran mais pas intéressées par Python ne le verront pas.) Certaines recommandations sont déjà données dans scicomp.stackexchange.com/questions/8617 .
Christian Clason
1
Si vous connaissez matlab, vous pouvez apprendre la plupart des algorithmes numériques en les implémentant là-bas, bien que vos performances soient presque toujours pires que les routines matlab intégrées. À partir de là, vous pouvez décider de vos besoins en matière de performances et passer à une bibliothèque / langue plus efficace.
Godric Seer

Réponses:

29

Facilité d'apprentissage

Python et Fortran sont tous deux des langages relativement faciles à apprendre. Il est probablement plus facile de trouver de bons supports d'apprentissage Python que de bons supports d'apprentissage Fortran car Python est utilisé plus largement et Fortran est actuellement considéré comme un langage "spécialisé" pour l'informatique numérique.

Je pense que la transition de Python à Fortran serait plus facile. Python est un langage interprété, donc le nombre d'étapes nécessaires pour lancer votre premier programme est plus petit (ouvrez l'interpréteur, tapez print("Hello, world!")à l'invite) que pour Fortran (écrivez un programme "Hello world", compilez, exécutez). Je pense également qu'il existe de meilleurs matériaux pour enseigner le style orienté objet en Python que dans Fortran, et qu'il y a plus de code Python disponible sur GitHub que de code Fortran.

Mise en route et exécution sous Windows

L'installation de Python devrait être moins pénible; il existe des distributions Windows. Je recommande d'utiliser une distribution scientifique comme Anaconda ou Enthought Canopy. Il n'y a pas vraiment de compilateur en soi; l'interprète joue ce rôle. Vous voudrez utiliser un interpréteur basé sur CPython, car il y a plus de bibliothèques numériques disponibles et il interagit bien avec C, C ++ et Fortran. D'autres implémentations d'interpréteur incluent Jython et PyPy.

Sur une machine Windows, l'installation d'un compilateur Fortran va être ennuyeuse. Les compilateurs en ligne de commande typiques sont des programmes comme gfortran, ifort (d'Intel; gratuit pour un usage personnel, sinon coûte de l'argent) et pgfortran (de PGI; versions d'essai gratuites, sinon coûte de l'argent). Pour installer ces compilateurs, vous devrez peut-être installer une sorte de couche de compatibilité de type UNIX / POSIX, comme Cygwin ou MinGW. J'ai trouvé ça pénible de travailler avec, mais certaines personnes aiment ce flux de travail. Vous pouvez également installer un compilateur avec une interface graphique, comme Visual Fortran (encore une fois, vous devrez payer pour une licence).

Sous Linux, il sera plus facile d'installer Python et des compilateurs; J'installerais toujours Anaconda ou Enthought Canopy en tant que distribution Python.

Vitesse: un compromis productivité / performance

En utilisant Python (ou MATLAB, Mathematica, Maple ou tout autre langage interprété), vous abandonnez les performances pour la productivité. Par rapport à Fortran (ou C ++, C ou tout autre langage compilé), vous écrirez moins de lignes de code pour accomplir la même tâche, ce qui signifie généralement qu'il vous faudra moins de temps pour obtenir une solution de travail.

La pénalité de performance effective pour l'utilisation de Python varie et est atténuée par la délégation de tâches gourmandes en calcul aux langages compilés. MATLAB fait quelque chose de similaire. Lorsque vous effectuez une multiplication matricielle dans MATLAB, il appelle BLAS; la pénalité de performance est pratiquement nulle et vous n'avez pas eu à écrire de Fortran, C ou C ++ pour obtenir des performances élevées. Une situation similaire existe en Python. Si vous pouvez utiliser des bibliothèques (par exemple, NumPy, SciPy, petsc4py, dolfin de FEniCS, PyClaw), vous pouvez écrire tout votre code en Python et obtenir de bonnes performances (une pénalité de 10 à 40% peut-être) à cause de tout le calcul les parties intensives sont des appels à des bibliothèques de langues compilées rapidement. Cependant, si vous deviez tout écrire en Python pur, la pénalité de performance serait un facteur de 100 à 1000x. Donc, si vous vouliez utiliser Python et deviez inclure une personnalisation, routine de calcul intensif, vous feriez mieux d'écrire cette partie dans un langage compilé comme C, C ++ ou Fortran, puis de l'encapsuler avec une interface Python. Il existe des bibliothèques qui facilitent ce processus (comme Cython et f2py), et des tutoriels pour vous aider; il n'est généralement pas onéreux.

Portée d'utilisation

Python est utilisé plus largement dans l'ensemble comme langage à usage général. Fortran est largement limité à l'informatique numérique et scientifique, et est principalement en concurrence avec le C et le C ++ pour les utilisateurs de ce domaine.

En science informatique, Python n'est généralement pas en concurrence directe avec les langages compilés en raison des pénalités de performances que j'ai mentionnées. Vous utiliseriez Python pour les cas où vous souhaitez une productivité et des performances élevées est une considération secondaire, comme dans le prototypage d'algorithmes à forte intensité numérique, le traitement des données et la visualisation. Vous utiliseriez Fortran (ou un autre langage compilé) lorsque vous avez une bonne idée de ce que devraient être la conception de votre algorithme et de votre application, que vous êtes prêt à passer plus de temps à écrire et à déboguer votre code, et que les performances sont primordiales. (Par exemple, les performances sont une étape limitante dans votre processus de simulation, ou c'est un livrable clé dans votre recherche.) Une stratégie courante consiste à mélanger Python et un langage compilé (généralement C ou C ++, mais Fortran a également été utilisé), et n'utilisez le langage compilé que pour les parties du code les plus sensibles aux performances; le coût de développement est, bien sûr, qu'il est plus difficile d'écrire et de déboguer un programme en deux langues qu'un programme en une seule langue.

En termes de parallélisme, la norme MPI actuelle (MPI-3) a des liaisons Fortran et C natives. La norme MPI-2 avait des liaisons C ++ natives, mais pas MPI-3, et vous devriez utiliser les liaisons C. Il existe des liaisons MPI tierces, telles que mpi4py. J'ai utilisé mpi4py; cela fonctionne bien et est simple à utiliser. Pour le parallélisme à grande échelle (des dizaines de milliers de cœurs), vous voudrez probablement utiliser un langage compilé parce que des choses comme le chargement dynamique des modules Python vous mordront dans le cul à l'échelle si vous le faites de manière naïve. Il existe des moyens de contourner ce goulot d'étranglement, comme l'ont démontré les développeurs de PyClaw, mais il est plus simple de l'éviter.

Opinions personnelles

J'ai environ une décennie d'expérience en Fortran 90/95, et j'ai également programmé en Fortran 2003. J'ai environ cinq ans d'expérience en programmation en Python. J'utilise Python beaucoup plus que j'utilise Fortran parce que, franchement, j'en fais plus en Python. La majorité du travail que je dois faire ne nécessite pas de ressources de calcul intensif et ne vaut généralement pas la peine d'être re-développé dans un autre langage, donc Python est très bien pour résoudre les ODE et les PDE. Si j'ai besoin d'utiliser un langage compilé, j'utiliserai C, C ++ ou Fortran, dans cet ordre.

La plupart du code Fortran que j'ai vu est moche, principalement parce que la plupart de la communauté des sciences informatiques semble ignorer ou être opposée aux meilleures pratiques découvertes par les ingénieurs logiciels au cours des 30 dernières années. À savoir: il n'y a pas de bon cadre de tests unitaires à Fortran. (Le meilleur que j'ai rencontré est FUnit, de la NASA, et ce n'est plus maintenu.) Il y a quelques bons cadres de test d'unité Python, de bons générateurs de documentation Python et généralement de nombreux meilleurs exemples de bonnes pratiques de programmation.

Geoff Oxberry
la source
Réponse très agréable et complète :). J'ai installé Linux hier où le compilateur python était déjà présent. Maintenant, je me demandais s'il y avait un moyen facile de partager des fichiers entre ma machine Linux et Windows? J'ai remarqué que chaque fois que j'utilise un bâton pour transférer des données, la machine Windows et Linux ignorent certaines parties sur de stich (qui est formatée au format NFTS).
Nick
et mon dernier problème est résolu en utilisant le format FAT32 (jusqu'à présent au moins).
Nick
NB: FAT32 a une taille de fichier maximale limitée.
meawoppl
@Meawoppl, existe-t-il un moyen plus pratique d'échanger des fichiers entre Linux et Windows? Peut-être alors dropbox? Existe-t-il également une solution matérielle?
Nick
Gardez vos fichiers sous 4 Go: P Vraiment, je ne connais pas de bonne solution. Il existe également un certain dérèglement dans les conventions de nom de fichier. Je me souviens d'avoir cassé le support de Windows une fois en nommant un fichier <3.txt, ce qui rendait M $ assez triste. La prise en charge NTFS sous Linux est assez bonne maintenant, mais est notamment un non-droit total sous OSX. Je pensais vraiment que nous aurions résolu ce problème maintenant.
meawoppl
7

Je resterais loin de Fortan, ou si vous devez, utiliser une version raisonnablement nouvelle (2003 plutôt que 77). Beaucoup de logiciels de physique (simulations Monte Carlo en particulier) sont écrits en Fortran, tout simplement parce que les projets ont été lancés à l'origine dans les années 80.

Cela étant dit, python et Fortran sont deux langages très différents, et ce à quoi ils doivent être utilisés est très différent. Python est de haut niveau et en général pas si rapide (par rapport à Fortran et C ++). La raison pour laquelle il est tellement utilisé est qu'il est assez rapide pour la plupart des choses et possède d'excellentes bibliothèques (alimentées par Fortran) pour beaucoup (mais pas toutes) des choses que vous aimeriez faire. Il a également l'excellent Matplotlib pour le traçage (donc pas besoin de GNUplot) et vous pouvez obtenir des performances assez décentes en utilisant des trucs comme Cython pour écrire les bits coûteux. Cependant, il ne sera pas aussi rapide que Fortran ou C ++, et la parallélisation est assez terrible, ce qui la rend inadéquate pour le calcul numérique haute performance. Si vous pouvez gérer ce que vous voulez en appelant les bibliothèques Fortran ou C,

Fortran est un langage de niveau un peu inférieur. Pour les données numériques, la prise en charge de la bibliothèque est étonnamment bonne, mais elle est toujours de très bas niveau, ce qui vous donne une multitude de bogues que vous pourriez autrement éviter, tels que le passage accidentel de la mauvaise taille de tableau à une méthode. Ces bogues sont difficiles à trouver et vous ne les remarquerez peut-être pas du tout. Croyez-moi, j'ai passé un bon moment à écrire Fortran 77.

Le C ++ est (à mon humble avis) un juste milieu. Avec des bibliothèques comme Armadillo ou Eigen, vous pouvez vous en tirer avec un style de codage assez élevé tout en obtenant un style de performance de bas niveau.

En parlant de performances, le seul vrai choix pour le python numérique en ce moment est CPython. Si vous téléchargez quelque chose comme WinPython, vous obtiendrez également la majorité des bibliothèques dont vous avez besoin.

Pour Fortran sur les fenêtres, les choses sont un peu plus difficiles. Je recommanderais de passer à Linux et d'utiliser soit le compilateur ifort gfortran soit Intels. Ifort a tendance à être plus rapide pour le code numérique dans mon expérience, mais n'est gratuit que pour une utilisation non commerciale et non académique.

Pour résumer: à moins que vous ne vouliez exécuter des simulations vraiment lourdes, python est de loin le choix le plus facile et beaucoup plus agréable à utiliser. Il devrait également être assez rapide pour la plupart des projets de niveau étudiant. Si vous avez besoin de meilleures performances, commencez par regarder les quantités inutiles de bibliothèques déjà écrites et laissez-les décider de votre langue. Si vous devez écrire des choses à partir de zéro, utilisez C ++.

Aussi un avertissement: la plupart du code écrit par les physiciens est assez terrible, probablement parce que les physiciens ont tendance à supposer que la programmation est facile et ne nécessite pas la même rigueur qu'ils pourraient utiliser en mathématiques. Pensez à suivre un cours ou à acheter un livre qui enseigne la programmation.

Avertissement: Je suis un physicien qui a passé un certain temps avec les codes Monte Carlo basés sur Fortran 77 et fait actuellement tout son traitement de données en Python.

LKlevin
la source
Concernant la parallélisation, les chercheurs ont utilisé Python en parallèle avec succès sur des dizaines de milliers de cœurs avec une bonne efficacité parallèle. (Par exemple, PyClaw a été exécuté sur l'ensemble de Shaheen, soit plus de 65 000 cœurs.)
Geoff Oxberry
1
Eh bien c'est possible, mais à ma connaissance seulement en s'assurant que la partie parallèle se passe en dehors de CPython ce qui est un effort considérable. La partie parallèle de PyClaw (PETSc) est écrite en C par exemple. Une autre alternative consiste à exécuter plusieurs instances de CPython, mais ce n'est pas exactement trivial.
LKlevin
La plupart des applications parallèles ne sont pas triviales. Vous avez écrit: "La parallélisation [Python] est assez terrible, ce qui la rend inadéquate pour le calcul numérique haute performance." Personne n'écrit de code haute performance en pur Python. Le raisonnement de cette décision n'a rien à voir avec le parallélisme et n'invalide pas l'utilisation de Python comme langage d'interface dans le calcul haute performance, tant qu'il est utilisé de manière appropriée. Votre citation est un homme de paille qui confond les problèmes de parallélisme, de haute performance et de langages interprétés; personne compétent ne concevrait une telle application.
Geoff Oxberry
Je suis d'accord que Python est un excellent langage d'interface pour presque n'importe quel but, mais cela s'éloigne de la question. La plupart des applications ne sont pas triviales, le problème ici est que tous les cas de parallélisation, y compris les cas triviaux, ne sont pas triviaux en python. Cela peut être gênant si votre problème est par ailleurs bien décrit en termes d'opérations Numpy ou Cython. Non, vous ne l'utiliseriez pas sur un cluster de 65 000 cœurs, mais vous pourriez accepter la performance 2x sur un 100 cœurs.
LKlevin
Par rapport au parallélisme, ce qui est bien avec Fortran, c'est qu'en plus de MPI / OpenMP, il y a aussi des co-tableaux qui font désormais partie de la norme. Par exemple, voir ce jolts.stanford.edu/72/…
stali
7

Python est un langage de très haut niveau très lent. Pour un calcul rapide des nombres, vous devrez écrire les principaux noyaux de calcul dans des langages de bas niveau comme C / C ++, ce qui signifie que vous devez maintenant apprendre non pas une mais au moins deux langues. Vous devrez également faire face à des maux de tête supplémentaires associés au débogage / à l'installation / à la maintenance, etc. La plupart des gens utilisent Python comme sucre syntaxique pour masquer les courtes arrivées de C / C ++.

Le Fortran moderne (90 et versions ultérieures) est à la fois rapide et de haut niveau avec une syntaxe presque MATLAB. Vous pouvez donc faire des choses comme:

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

ou

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

ou encore plus simple

indx=indxmap(indx,2)

etc.

Sous Linux, il existe un certain nombre de compilateurs Fortran gratuits. j'utilise

  1. GCC
  2. Solaris Studio
  3. Open64
  4. Intel (usage non commercial uniquement)

Je n'utilise pas Macs / OSX mais il y a PGI gratuit.

Et veuillez ne pas utiliser FORTRAN 77. Personne ne l'utilise pour écrire un nouveau code.

Avertissement: J'ai personnellement consulté Python pour écrire mon propre petit code FE non structuré (construit en haut de PETSc) mais la quantité de travail / codage impliqué était plus que de l'écrire en clair Fortran 95.

stali
la source
1
J'ajouterais à cela que vous pouvez faire une programmation orientée objet assez sérieuse dans Fortran 2003; voir par exemple ce guide . Je l'ai beaucoup utilisé dans mon propre code et cela a été très efficace pour ce que je veux faire. Beaucoup de gens vous diront de l'éviter - je dis gardez l'esprit ouvert, vous aimerez peut-être beaucoup. Je fais certainement.
Daniel Shapero
4

Python est très pratique pour l'analyse de simulation complète avec des packages polyvalents bien documentés: génération de grille, calcul de tableau et gestion de la structure des données ( numpy et pandas ) ainsi que la visualisation des données avec matplotlib. Pour les simulations complexes avec de gros fichiers de résultats, il est encore mieux de travailler avec le package VTK qui permet d'exporter les données à lire par des applications open source avancées (comme Paraview ou Visit)

Fortran est depuis quelque temps la langue préférée pour différents domaines dans les simulations. Il est facilement lisible (cependant moins lisible que le code Python). La gestion des tableaux est l'un des points forts du langage, assez facile à définir et à utiliser dans toutes sortes d'opérations de tableaux. Il est également utile lors du débogage.

La comparaison se résume aux performances : je n'ai fait que des calculs à grande échelle en utilisant des langages compilés (C ++ et Fortran 90) mais jamais avec Python. Un autre fil donne plus d'informations sur les performances des langues interprétées et compilées: Quelle langue dois-je utiliser lors de l'enseignement d'un cours de premier cycle en programmation informatique?

Personnellement, j'aime travailler avec Python en général, en particulier pour le post-traitement. La programmation Python est amusante!

SAAD
la source
1
La performance est presque toujours importante. Le manque d'attention aux performances est la raison pour laquelle les gens ont besoin de 8 cœurs avec 16 Go de RAM pour consulter leurs e-mails et surfer sur le Web.
stali
J'ai eu le malheur de devoir lire le code python des autres. Je ne catégoriserais pas le code py comme facile à lire.
Biswajit Banerjee
@stali: Je suis totalement d'accord
SAAD
1
@BiswajitBanerjee: il n'est pas impossible d'écrire du code compliqué avec n'importe quel langage, mais au moins je peux facilement identifier les entrées et sorties de n'importe quelle fonction, voici où Fortran devient horrible! :)
SAAD
3

Avec Python, vous n'avez pas besoin de Gnuplot, vous pouvez utiliser, par exemple, matplotlib et / ou utiliser le shell IPython. IPython est un shell Python interactif qui, en mode% pylab, fournit à peu près les mêmes commandes de traçage que celles disponibles dans MATLAB.

Il est fort probable que le calcul scientifique passera dans une large mesure de MATLAB à Python au cours des 5 prochaines années.

jolvi
la source
Un des avantages de Gnuplot est qu'il est presque toujours installé sur des machines Linux (cluster / serveurs, etc.) et très utile pour une visualisation rapide / sale. C'est comme vi pour savoir.
stali
1

Je continuerais à utiliser MATLAB, il appelle des bibliothèques mathématiques rapides, et vous ne verrez pas beaucoup de différence de performances en passant à FORTRAN sous Windows. Dans le même temps, vous disposerez d'une meilleure infrastructure dans MATLAB pour la génération de rapports sur les résultats et l'exécution de votre code. L'inconvénient de MATLAB est son coût. FORTRAN est fondamentalement gratuit, et il y a un tas de bibliothèques gratuites.

FORTRAN est très facile à apprendre et à démarrer la programmation. Il fait essentiellement ce que son nom suggère: traduit vos formules en code, qui est facile à lire et à comprendre. C'est pourquoi les physiciens l'utilisaient beaucoup autrefois. Tant que la majeure partie de votre code consiste à résoudre des problèmes de physique (pas à créer des interfaces graphiques ou à faire d'autres trucs sympas), le code FORTRAN sera facile à maintenir.

Je recommanderais Python uniquement si vous aimez la programmation. Pensez à ceci: lorsque vous codez une solution à un problème de physique, aimez-vous programmer une partie de la solution? Si vous le faites, alors Python est une option, car le langage est bien meilleur que MATLAB.

Aksakal
la source
2
Votre déclaration sur les différences de performances lors du passage de MATLAB à Fortran n'est pas vraie en général. Fortran est idéal si vous écrivez du code pour lequel les tableaux sont une structure de données naturellement bonne, si vous pouvez vivre avec la façon dont il gère les E / S et s'il possède les bibliothèques dont vous avez besoin. Les bibliothèques numériques en Python se chevauchent fortement en fonctionnalités avec MATLAB, et je trouve plus facile d'écrire des interfaces Python en code C que des interfaces MATLAB en code C.
Geoff Oxberry
Parfois , vous ne voyez beaucoup de différence. J'ai récemment réécrit un programme de simulation physique de Matlab (en utilisant le package bvp6c en interne) vers Fortran 2008 (en utilisant le package bvp_solver en interne), et le temps d'exécution est tombé à seulement 1,4% après le changement, même si je n'ai pas modifié les algorithmes ou la structure globale du programme. Pour une simulation qui nécessitait auparavant environ 3,5 jours par point de données pour converger, il s'agissait d'une amélioration très notable.
jabirali