Welches ist besser: FORTRAN oder Python? Und in beiden Fällen brauchst du wohl Gnuplot, oder?
Ich arbeite gerade an einem Windows-Computer.
Ich würde es gerne verwenden, um numerische Lösungen für physikalische Probleme zu erhalten, einschließlich Monte-Carlo-Simulationen, numerische Integration und Differenzierung, Molekulardynamik usw.
Ich habe einen Kurs über Computerphysik gesehen, in dem sowohl FORTRAN (glaube ich) als auch Python vorgestellt werden. Ich plane, mit dem einen zu beginnen und dann das andere zu lernen, aber ich weiß nicht, welcher Übergang der einfachste sein könnte.
Auch welche Compiler würden Sie empfehlen?
Die Grundfrage für mich lautet: Welches ist am einfachsten zu lernen, welches ist am schnellsten, welches ist am benutzerfreundlichsten und vor allem welches wird am häufigsten verwendet (also ein Vergleich dieser 4)? Und daneben, welche (kostenlosen oder kostenpflichtigen) Compiler werden am häufigsten verwendet? Ich überlege derzeit, einen alten Laptop (früher Intel Dual Core) auf Linux umzustellen. hoffentlich ist das schnell genug.
Vielen Dank für die bisherigen Antworten! Die Antworten, nach denen ich suche, sind die von LKlevin und SAAD.
Ich kenne die Grundlagen von C ++, Maple und beherrsche MATLAB und Mathematica9 fast vollständig, wenn das hilft.
Antworten:
Einfaches Lernen
Python und Fortran sind relativ einfach zu erlernende Sprachen. Es ist wahrscheinlich einfacher, gute Python-Lernmaterialien zu finden als gute Fortran-Lernmaterialien, da Python häufiger verwendet wird und Fortran derzeit als Spezialsprache für das numerische Rechnen gilt.
Ich glaube, der Übergang von Python nach Fortran wäre einfacher. Python ist eine interpretierte Sprache, daher ist die Anzahl der Schritte, die erforderlich sind, um Ihr erstes Programm zum Laufen zu bringen, geringer (öffnen Sie den Interpreter, geben Sie
print("Hello, world!")
an der Eingabeaufforderung ein) als die für Fortran (schreiben Sie ein "Hallo Welt" -Programm, kompilieren Sie, führen Sie es aus). Ich denke auch, dass es in Python bessere Materialien zum Unterrichten des objektorientierten Stils gibt als in Fortran, und dass auf GitHub mehr Python-Code verfügbar ist als in Fortran-Code.Unter Windows einsatzbereit
Die Installation von Python sollte weniger schmerzhaft sein. Es sind Windows-Distributionen verfügbar. Ich empfehle eine wissenschaftliche Distribution wie Anaconda oder Enthought Canopy. Es gibt an sich keinen Compiler; Der Dolmetscher übernimmt diese Rolle. Sie sollten einen CPython-basierten Interpreter verwenden, da mehr numerische Bibliotheken verfügbar sind und eine gute Zusammenarbeit mit C, C ++ und Fortran besteht. Andere Interpreter-Implementierungen umfassen Jython und PyPy.
Auf einem Windows-Computer ist die Installation eines Fortran-Compilers ärgerlich. Typische Befehlszeilen-Compiler sind Programme wie gfortran, ifort (von Intel; für den persönlichen Gebrauch kostenlos, sonst kosten sie Geld) und pgfortran (von PGI; kostenlose Testversionen, sonst kosten sie Geld). Um diese Compiler zu installieren, müssen Sie möglicherweise eine Art UNIX / POSIX-Kompatibilitätsebene wie Cygwin oder MinGW installieren. Ich fand es schwierig, damit zu arbeiten, aber manche Leute mögen diesen Workflow. Sie können auch einen Compiler mit einer grafischen Benutzeroberfläche wie Visual Fortran installieren (erneut müssen Sie eine Lizenz bezahlen).
Unter Linux ist es einfacher, Python und Compiler zu installieren. Ich würde weiterhin Anaconda oder Enthought Canopy als Python-Distribution installieren.
Geschwindigkeit: ein Kompromiss zwischen Produktivität und Leistung
Wenn Sie Python (oder MATLAB, Mathematica, Maple oder eine andere interpretierte Sprache) verwenden, geben Sie die Leistung für die Produktivität auf. Im Vergleich zu Fortran (oder C ++, C oder einer anderen kompilierten Sprache) schreiben Sie weniger Codezeilen, um dieselbe Aufgabe zu erledigen, was im Allgemeinen bedeutet, dass Sie weniger Zeit benötigen, um eine funktionierende Lösung zu finden.
Die effektive Leistungseinbuße für die Verwendung von Python ist unterschiedlich und wird gemindert, indem rechenintensive Aufgaben an kompilierte Sprachen delegiert werden. MATLAB macht etwas Ähnliches. Wenn Sie in MATLAB eine Matrixmultiplikation durchführen, wird BLAS aufgerufen. Die Performance-Einbußen sind praktisch Null, und Sie mussten kein Fortran, C oder C ++ schreiben, um die hohe Performance zu erzielen. Eine ähnliche Situation besteht in Python. Wenn Sie Bibliotheken verwenden können (z. B. NumPy, SciPy, petsc4py, dolfin von FEniCS, PyClaw), können Sie Ihren gesamten Code in Python schreiben und erhalten eine gute Leistung (eine Strafe von vielleicht 10-40%), weil alle rechnerisch Intensive Teile sind Aufrufe an schnell kompilierte Sprachbibliotheken. Wenn Sie jedoch alles in reinem Python schreiben würden, wäre der Leistungsverlust ein Faktor von 100-1000x. Also, wenn Sie Python verwenden wollten und eine benutzerdefinierte einschließen mussten, Bei einer rechenintensiven Routine ist es besser, diesen Teil in einer kompilierten Sprache wie C, C ++ oder Fortran zu schreiben und ihn dann mit einer Python-Schnittstelle zu verpacken. Es gibt Bibliotheken (wie Cython und f2py), die diesen Prozess erleichtern, und Tutorials, die Ihnen helfen. es ist im Allgemeinen nicht lästig.
Nutzungsumfang
Python wird allgemein als Allzwecksprache verwendet. Fortran beschränkt sich weitgehend auf numerisches und wissenschaftliches Rechnen und konkurriert hauptsächlich mit C und C ++ um Benutzer in dieser Domäne.
In der Computerwissenschaft konkurriert Python normalerweise nicht direkt mit kompilierten Sprachen, da die von mir genannten Performance-Nachteile auftreten. Sie würden Python in Fällen einsetzen, in denen hohe Produktivität und Leistung von untergeordneter Bedeutung sind, z. B. beim Prototyping numerisch intensiver Algorithmen, der Datenverarbeitung und der Visualisierung. Sie würden Fortran (oder eine andere kompilierte Sprache) verwenden, wenn Sie eine gute Vorstellung davon haben, wie Ihr Algorithmus und Ihr Anwendungsdesign aussehen sollten, Sie bereit sind, mehr Zeit mit dem Schreiben und Debuggen Ihres Codes zu verbringen, und die Leistung ist von größter Bedeutung. (Zum Beispiel ist die Leistung ein einschränkender Schritt in Ihrem Simulationsprozess oder ein wesentlicher Bestandteil Ihrer Forschung.) Eine gängige Strategie besteht darin, Python und eine kompilierte Sprache zu mischen (normalerweise C oder C ++, aber Fortran wurde auch verwendet). Verwenden Sie die kompilierte Sprache nur für die leistungsempfindlichsten Teile des Codes. Die Entwicklungskosten liegen natürlich darin, dass es schwieriger ist, ein Programm in zwei Sprachen zu schreiben und zu debuggen, als ein Programm in einer einzigen Sprache.
In Bezug auf die Parallelität weist der aktuelle MPI-Standard (MPI-3) native Fortran- und C-Bindungen auf. Der MPI-2-Standard hatte native C ++ - Bindungen, MPI-3 jedoch nicht, und Sie müssten die C-Bindungen verwenden. Es gibt MPI-Bindungen von Drittanbietern, z. B. mpi4py. Ich habe MPI4PY verwendet. es funktioniert gut und ist einfach zu bedienen. Für eine groß angelegte Parallelität (Zehntausende von Kernen) möchten Sie wahrscheinlich eine kompilierte Sprache verwenden, da Dinge wie das dynamische Laden der Python-Module Sie in den Arsch reißen, wenn Sie dies auf naive Weise tun. Es gibt Möglichkeiten, diesen Engpass zu umgehen, wie die PyClaw-Entwickler gezeigt haben, aber es ist einfacher, ihn zu vermeiden.
Persönliche Meinungen
Ich habe ungefähr ein Jahrzehnt Erfahrung in Fortran 90/95 und ich habe auch in Fortran 2003 programmiert. Ich habe ungefähr fünf Jahre Erfahrung im Programmieren in Python. Ich benutze Python viel häufiger als Fortran, weil ich ehrlich gesagt in Python mehr erledige. Der Großteil der Arbeit, die ich zu erledigen habe, erfordert keine großen Supercomputer-Ressourcen und ist im Allgemeinen nicht wert, in einer anderen Sprache neu entwickelt zu werden. Python ist daher gut geeignet, um ODEs und PDEs zu lösen. Wenn ich eine kompilierte Sprache verwenden muss, verwende ich C, C ++ oder Fortran in dieser Reihenfolge.
Der größte Teil des Fortran-Codes, den ich gesehen habe, war hässlich, vor allem, weil die meisten Computerwissenschaftler keine Best Practices kannten oder diesen ablehnten, die von Software-Ingenieuren in den letzten 30 Jahren entdeckt wurden. Das heißt: In Fortran gibt es kein gutes Unit-Testing-Framework. (Das Beste, auf das ich gestoßen bin, ist FUnit von der NASA, und das wird nicht mehr gepflegt.) Es gibt einige gute Python-Unit-Test-Frameworks, gute Python-Dokumentationsgeneratoren und im Allgemeinen viele bessere Beispiele für gute Programmierpraktiken.
quelle
Ich würde mich von Fortan fernhalten oder, wenn Sie müssen, eine einigermaßen neue Version (2003 statt 77) verwenden. Viele physikalische Software (insbesondere Monte-Carlo-Simulationen) wurde in Fortran geschrieben, einfach weil die Projekte ursprünglich in den 80er Jahren begonnen wurden.
Davon abgesehen sind Python und Fortran zwei sehr unterschiedliche Sprachen, und wofür sie verwendet werden sollten, ist ganz anders. Python ist auf hohem Niveau und im Allgemeinen nicht so schnell (verglichen mit Fortran & C ++). Der Grund, warum es so häufig verwendet wird, ist, dass es für die meisten Dinge schnell genug ist und exzellente (mit Fortran betriebene) Bibliotheken für viele (aber nicht alle) Dinge hat, die Sie gerne tun würden. Es hat auch die exzellente Matplotlib zum Plotten (es wird also kein GNUplot benötigt) und Sie können eine recht anständige Leistung erzielen, wenn Sie Dinge wie Cython zum Schreiben der teuren Bits verwenden. Es wird jedoch nicht so schnell sein wie Fortran oder C ++, und die Parallelisierung ist ziemlich schrecklich, was es für hochperformantes numerisches Rechnen ungeeignet macht. Wenn das, was Sie wollen, durch Aufrufen von Fortran- oder C-Bibliotheken erledigt werden kann,
Fortran ist eine etwas niedrigere Sprache. Für numerische Daten ist die Bibliotheksunterstützung überraschend gut, sie ist jedoch immer noch sehr niedrig, sodass Sie eine Vielzahl von Fehlern erhalten, die Sie sonst vermeiden könnten, z. B. die versehentliche Übergabe der falschen Arraygröße an eine Methode. Diese Fehler sind schwer zu finden und Sie werden sie möglicherweise gar nicht bemerken. Vertrauen Sie mir, ich habe eine ganze Weile damit verbracht, Fortran 77 zu schreiben.
C ++ ist (meiner bescheidenen Meinung nach) ein fröhliches Medium. Mit Bibliotheken wie Armadillo oder Eigen kommen Sie mit einer relativ hohen Codierungsstufe und einer niedrigen Leistungsstufe klar.
Was die Leistung betrifft, so ist CPython derzeit die einzige echte Wahl für numerisches Python. Wenn Sie so etwas wie WinPython herunterladen, erhalten Sie auch die meisten Bibliotheken, die Sie benötigen.
Für Fortran an Fenstern ist es etwas schwieriger. Ich würde empfehlen, auf Linux umzusteigen und entweder Gfortran oder Intel Ifort Compiler zu verwenden. Nach meiner Erfahrung ist Ifort für numerischen Code in der Regel schneller, ist jedoch nur für den nicht kommerziellen, nicht akademischen Gebrauch kostenlos.
Zusammenfassend lässt sich sagen, dass Python die einfachere Wahl ist und die Arbeit viel angenehmer macht, es sei denn, Sie möchten wirklich schwere Simulationen ausführen. Es sollte auch für die meisten Projekte auf Studentenebene schnell genug sein. Wenn Sie eine bessere Leistung benötigen, schauen Sie sich zunächst die verschwendeten Mengen der bereits geschriebenen Bibliotheken an und überlassen Sie dies Ihrer Sprache. Wenn Sie Dinge von Grund auf neu schreiben müssen, verwenden Sie C ++.
Auch eine Warnung: Die meisten von Physikern geschriebenen Codes sind ziemlich schrecklich, vermutlich weil Physiker die Tendenz haben anzunehmen, dass das Programmieren einfach ist und nicht die gleiche Strenge erfordert, die sie in der Mathematik anwenden könnten. Erwägen Sie, eine Klasse zu besuchen oder ein Buch zu kaufen, in dem Programmieren unterrichtet wird.
Haftungsausschluss: Ich bin ein Physiker, der einige Zeit mit Monte-Carlo-Codes auf der Basis von Fortran 77 verbracht hat und derzeit alle Daten in Python verarbeitet.
quelle
Python ist eine sehr langsame Hochsprache. Für eine schnelle Zahlenverarbeitung müssen Sie die wichtigsten Rechenkerne in einfachen Sprachen wie C / C ++ schreiben, was bedeutet, dass Sie jetzt nicht nur eine, sondern mindestens zwei Sprachen lernen müssen. Sie müssen sich auch mit zusätzlichen Kopfschmerzen im Zusammenhang mit Debugging / Installation / Wartung usw. auseinandersetzen. Die meisten Leute verwenden Python als syntaktischen Zucker, um die Mängel von C / C ++ zu verbergen.
Das moderne Fortran (90 und höher) ist sowohl schnell als auch auf hohem Niveau mit fast MATLAB-ähnlicher Syntax. So können Sie Dinge tun wie:
oder
oder noch einfacher
etc.
Unter Linux gibt es eine Reihe kostenloser Fortran-Compiler. ich benutze
Ich benutze keinen Mac / OSX, aber es gibt kostenlose PGI.
Und bitte verwenden Sie FORTRAN 77 nicht. Niemand verwendet es, um neuen Code zu schreiben.
Haftungsausschluss: Ich habe Python persönlich angeschaut, um meinen eigenen kleinen, unstrukturierten FE-Code (der auf PETSc aufbaut) zu schreiben, aber der Arbeitsaufwand / die damit verbundene Codierung war mehr als das reine Schreiben von Fortran 95.
quelle
Python ist sehr praktisch für eine vollständige Simulationsanalyse mit gut dokumentierten, vielseitigen Paketen: Gittererzeugung, Arrayberechnung und Datenstrukturverarbeitung ( Numpy und Pandas ) sowie Datenvisualisierung mit Matplotlib. Für komplexe Simulationen mit großen Ergebnisdateien ist es noch besser, mit dem VTK-Paket zu arbeiten, mit dem Datenexporte von erweiterten Open-Source-Anwendungen (wie Paraview oder Visit) gelesen werden können.
Fortran ist seit einiger Zeit die bevorzugte Sprache für verschiedene Bereiche in Simulationen. Es ist leicht lesbar (allerdings weniger lesbar als Python-Code). Die Handhabung von Arrays ist eine der Stärken der Sprache. Sie ist recht einfach zu definieren und in allen Arten von Array-Operationen zu verwenden. Dies ist auch beim Debuggen praktisch.
Der Vergleich kommt auf die Leistung an : Ich habe nur umfangreiche Berechnungen mit kompilierten Sprachen (C ++ und Fortran 90) durchgeführt, aber nie mit Python. Ein anderer Thread enthält weitere Informationen zur Leistung von interpretierten und kompilierten Sprachen: Welche Sprache sollte ich verwenden, wenn ich einen Grundkurs in Computerprogrammierung unterrichte?
Persönlich mag ich die Arbeit mit Python im Allgemeinen, insbesondere für die Nachbearbeitung. Python-Programmierung macht Spaß!
quelle
Mit Python brauchen Sie Gnuplot nicht, Sie können zum Beispiel matplotlib und / oder die IPython-Shell verwenden. IPython ist eine interaktive Python-Shell, die im% pylab-Modus fast die gleichen Zeichenbefehle bietet, die Sie in MATLAB haben.
Es ist sehr wahrscheinlich, dass sich das wissenschaftliche Rechnen in den nächsten 5 Jahren in großem Umfang von MATLAB auf Python verlagern wird.
quelle
Ich würde weiterhin MATLAB verwenden. Es ruft schnelle mathematische Bibliotheken auf, und Sie werden keinen großen Leistungsunterschied feststellen, wenn Sie unter Windows zu FORTRAN wechseln. Gleichzeitig verfügen Sie in MATLAB über eine bessere Infrastruktur für das Melden von Ergebnissen und das Ausführen Ihres Codes. Der Nachteil von MATLAB sind die Kosten. FORTRAN ist grundsätzlich kostenlos und es gibt eine Reihe von kostenlosen Bibliotheken.
FORTRAN ist sehr einfach zu erlernen und zu programmieren. Es macht im Wesentlichen das, was der Name andeutet: Es übersetzt Ihre Formeln in Code, der leicht zu lesen und zu verstehen ist. Das ist der Grund, warum Physiker es früher oft benutzten. Solange es in Ihrem Code hauptsächlich darum geht, physikalische Probleme zu lösen (keine GUIs zu erstellen oder andere coole Dinge zu erledigen), ist FORTRAN-Code einfach zu warten.
Ich würde Python nur empfehlen, wenn Sie gerne programmieren. Denken Sie daran: Wenn Sie eine Lösung für ein physikalisches Problem programmieren, genießen Sie es, einen Teil der Lösung zu programmieren? Wenn Sie dies tun, ist Python eine Option, da die Sprache viel besser ist als die von MATLAB.
quelle