Python vs FORTRAN

17

Który z nich jest lepszy: FORTRAN lub Python? I chyba w obu przypadkach potrzebujesz Gnuplot, mam rację?

Obecnie pracuję na komputerze z systemem Windows.

Chciałbym go użyć do uzyskania numerycznych rozwiązań problemów fizyki, w tym symulacji Monte-Carlo, integracji i różnicowania numerycznego, dynamiki molekularnej itp.

Widziałem kurs fizyki obliczeniowej, który wprowadza zarówno FORTRAN (77, jak sądzę) i Python. Planuję zacząć od jednego, a potem uczyć się drugiego, ale nie wiem, które przejście może być najłatwiejsze.

Które kompilatory poleciłbyś?

Podstawowe pytanie sprowadza się do tego: które z nich jest najłatwiejsze do nauczenia się, które jest najszybsze, które jest najbardziej przyjazne dla użytkownika, a przede wszystkim które jest najczęściej używane (więc porównanie tych 4)? A poza tym, jakie są najczęściej używane (bezpłatne lub płatne) kompilatory? Obecnie zastanawiam się nad konwersją starego laptopa (wczesny dwurdzeniowy Intel) na Linuksa; mam nadzieję, że to wystarczająco szybko.

Wielkie dzięki za dotychczasowe odpowiedzi! Odpowiedzi, które są zgodne z tym, czego szukam, to odpowiedzi LKlevina i SAADA.

Znam podstawy C ++, Maple i opanowuję MATLAB i Mathematica9 prawie całkowicie, jeśli to pomoże.

Nacięcie
źródło
12
Naprawdę musisz być bardziej szczegółowy; to jest jak pytanie „co jest lepsze: młotek lub śrubokręt?”. Spójrz na scicomp.stackexchange.com/questions/11006 (chodzi o C ++ zamiast Fortran, ale większość punktów powinna mieć jednakowe zastosowanie).
Christian Clason
@ChristianClason, fair point: p
Nick
Dzięki za edycję, choć tak naprawdę nie zawęża to rzeczy. Nie jestem pewien, co więcej można powiedzieć, niż podano już jako odpowiedzi na powyższe pytanie.
Christian Clason
2
Ponadto pytanie o kompilatory jest osobnym zagadnieniem i powinno być osobnym pytaniem. (W przeciwnym razie osoby zaznajomione z Fortranem, ale nie zainteresowane Pythonem, nie zobaczą go.) Niektóre rekomendacje są już podane w scicomp.stackexchange.com/questions/8617 .
Christian Clason
1
Jeśli znasz matlab, możesz nauczyć się większości algorytmów numerycznych, implementując je tam, chociaż twoja wydajność prawie zawsze będzie gorsza niż wbudowane procedury matlab. Stamtąd możesz zdecydować, jakie są Twoje potrzeby w zakresie wydajności i przejść do bardziej wydajnej biblioteki / języka.
Godric Seer

Odpowiedzi:

29

Łatwość nauki

Python i Fortran to języki stosunkowo łatwe do nauczenia się. Prawdopodobnie łatwiej jest znaleźć dobre materiały do ​​nauki w języku Python niż dobre materiały do ​​nauki w języku Fortran, ponieważ język Python jest używany w szerszym zakresie, a Fortran jest obecnie uważany za język „specjalistyczny” do obliczeń numerycznych.

Wierzę, że przejście z Python do Fortran byłoby łatwiejsze. Python jest językiem interpretowanym, więc liczba kroków potrzebnych do uruchomienia pierwszego programu jest mniejsza (otwórz interpreter, wpisz print("Hello, world!")polecenie) w porównaniu z Fortranem (napisz program „Hello world”, skompiluj, uruchom). Myślę też, że istnieją lepsze materiały do ​​nauczania stylu obiektowego w Pythonie niż w Fortranie, a na GitHub jest więcej kodu Python niż w języku Fortran.

Pierwsze kroki w systemie Windows

Instalowanie Pythona powinno być mniej bolesne; dostępne są dystrybucje Windows. Polecam użycie dystrybucji naukowej, takiej jak Anaconda lub Enthought Canopy. Tak naprawdę nie ma kompilatora; tłumacz pełni tę rolę. Będziesz chciał użyć interpretera opartego na CPython, ponieważ dostępnych jest więcej bibliotek numerycznych i dobrze współpracuje z C, C ++ i Fortran. Inne implementacje interpretera obejmują Jython i PyPy.

Na komputerze z systemem Windows instalacja kompilatora Fortran będzie denerwująca. Typowymi kompilatorami wiersza poleceń są programy takie jak gfortran, ifort (od Intela; bezpłatny do użytku osobistego, w przeciwnym razie kosztuje pieniądze) i pgfortran (z ChOG; bezpłatne wersje próbne, w przeciwnym razie kosztuje). Aby zainstalować te kompilatory, może być konieczne zainstalowanie jakiejś warstwy kompatybilności typu UNIX / POSIX, takiej jak Cygwin lub MinGW. Uznałem za trudny w pracy, ale niektórzy ludzie lubią ten przepływ pracy. Możesz także zainstalować kompilator z graficznym interfejsem użytkownika, taki jak Visual Fortran (ponownie, będziesz musiał zapłacić za licencję).

W systemie Linux łatwiej będzie zainstalować Python i kompilatory; Nadal instalowałbym Anaconda lub Enthought Canopy jako dystrybucję Pythona.

Szybkość: kompromis między wydajnością a wydajnością

Korzystając z Pythona (lub MATLAB, Mathematica, Klonu lub dowolnego tłumaczonego języka), rezygnujesz z wydajności dla produktywności. W porównaniu do Fortran (lub C ++, C lub dowolnego innego skompilowanego języka) napiszesz mniej wierszy kodu, aby wykonać to samo zadanie, co ogólnie oznacza, że ​​znalezienie działającego rozwiązania zajmie Ci mniej czasu.

Skuteczna obniżka wydajności za używanie Pythona jest różna i jest zmniejszana przez delegowanie zadań intensywnie obliczeniowych na skompilowane języki. MATLAB robi coś podobnego. Kiedy wykonujesz mnożenie macierzy w MATLAB, wywołuje BLAS; kara za wydajność jest praktycznie zerowa i nie musiałeś pisać Fortran, C ani C ++, aby uzyskać wysoką wydajność. Podobna sytuacja występuje w Pythonie. Jeśli możesz używać bibliotek (na przykład NumPy, SciPy, petsc4py, dolfin z FEniCS, PyClaw), możesz napisać cały kod w Pythonie i uzyskać dobrą wydajność (kara może być 10-40%), ponieważ wszystkie obliczeniowo części intensywne to wywołania szybkich bibliotek językowych. Jeśli jednak napiszesz wszystko w czystym języku Python, kara za wydajność wyniesie 100-1000x. Więc jeśli chcesz używać Pythona i musisz dołączyć niestandardowy, intensywnie obliczeniowo, lepiej byłoby napisać tę część w skompilowanym języku, takim jak C, C ++ lub Fortran, a następnie zawinąć ją w interfejs Pythona. Istnieją biblioteki, które ułatwiają ten proces (takie jak Cython i f2py) oraz tutoriale, które mogą ci pomóc; ogólnie nie jest uciążliwe.

Zakres zastosowania

Python jest szeroko stosowany jako język ogólnego przeznaczenia. Fortran jest w dużej mierze ograniczony do obliczeń numerycznych i naukowych i konkuruje głównie z C i C ++ dla użytkowników w tej dziedzinie.

W dziedzinie informatyki Python zazwyczaj nie konkuruje bezpośrednio ze skompilowanymi językami z powodu wspomnianych kar wydajnościowych. Python byłby używany w przypadkach, w których wymagana jest wysoka wydajność, a wydajność jest kwestią drugorzędną, na przykład przy prototypowaniu algorytmów intensywnie numerycznych, przetwarzaniu danych i wizualizacji. Korzystasz z Fortran (lub innego skompilowanego języka), gdy masz dobre pojęcie o tym, jaki powinien być twój algorytm i projekt aplikacji, chcesz poświęcić więcej czasu na pisanie i debugowanie kodu, a wydajność jest najważniejsza. (Na przykład wydajność jest ograniczającym krokiem w procesie symulacji lub kluczowym rezultatem badań). Powszechną strategią jest mieszanie Pythona z językiem kompilowanym (zwykle C lub C ++, ale Fortran również był używany), i używaj skompilowanego języka tylko do najbardziej wrażliwych części kodu; koszt opracowania jest oczywiście taki, że trudniej jest napisać i debugować program w dwóch językach niż program w jednym języku.

Pod względem równoległości obecny standard MPI (MPI-3) ma natywne wiązania Fortran i C. Standard MPI-2 miał natywne wiązania C ++, ale MPI-3 nie, i trzeba by użyć powiązań C. Istnieją powiązania MPI innych firm, takie jak mpi4py. Użyłem mpi4py; działa dobrze i jest prosty w użyciu. W przypadku paralelności na dużą skalę (dziesiątki tysięcy rdzeni) prawdopodobnie będziesz chciał użyć skompilowanego języka, ponieważ takie rzeczy jak dynamiczne ładowanie modułów Pythona ugryzie Cię w tyłek na dużą skalę, jeśli zrobisz to w naiwny sposób. Istnieją sposoby na obejście tego wąskiego gardła, jak wykazali twórcy PyClaw, ale łatwiej jest tego uniknąć.

Osobiste opinie

Mam około dekadę doświadczenia w Fortran 90/95, a także programowałem w Fortran 2003. Mam około pięć lat doświadczenia w programowaniu w Pythonie. Używam Pythona znacznie częściej niż Fortrana, ponieważ, szczerze mówiąc, robię więcej w Pythonie. Większość pracy, którą muszę wykonać, nie wymaga dużych zasobów superkomputerowych i generalnie nie jest warta ponownego rozwijania w innym języku, więc Python jest w porządku do rozwiązywania ODE i PDE. Jeśli będę musiał użyć skompilowanego języka, użyję C, C ++ lub Fortran, w tej kolejności.

Większość kodu Fortrana, który widziałem, była brzydka, głównie dlatego, że większość społeczności nauk komputerowych wydaje się nieświadoma najlepszych praktyk odkrytych przez inżynierów oprogramowania w ciągu ostatnich 30 lat. To znaczy: w Fortranie nie ma dobrych ram testowania jednostek. (Najlepsze, na jakie natknąłem się, to FUnit, NASA, którego już nie utrzymuję.) Istnieje kilka dobrych ram testowania jednostek Pythona, dobrych generatorów dokumentacji Python i ogólnie wiele lepszych przykładów dobrych praktyk programistycznych.

Geoff Oxberry
źródło
Bardzo ładna i pełna odpowiedź :). Wczoraj zainstalowałem Linuksa, w którym kompilator python był już obecny. Teraz zastanawiałem się, czy istnieje prosty sposób udostępniania plików między moim systemem Linux a komputerem z systemem Windows? Zauważyłem, że ilekroć używam kija do przesyłania danych, zarówno Windows, jak i Linux ignorują niektóre części de stich (które są sformatowane w formacie NFTS).
Nick
a mój ostatni problem został rozwiązany bij przy użyciu formatu FAT32 (przynajmniej do tej pory).
Nick
Uwaga: FAT32 ma ograniczony maksymalny rozmiar pliku.
meawoppl
@Meawoppl, czy istnieje bardziej wygodny sposób na zamianę plików między Linuksem a Windowsem? Może więc Dropbox? Czy istnieje również rozwiązanie sprzętowe?
Nick
Trzymaj pliki poniżej 4 GB: P Naprawdę, nie znam dobrego rozwiązania. W konwencjach nazw plików występuje także pewna podstępność. Pamiętam, jak raz złamałem obsługę niektórych okien, nazywając plik <3.txt, co sprawiło, że M $ było bardzo smutną miną. Obsługa NTFS w systemie Linux jest teraz całkiem dobra, ale w OSX jest całkowicie nie do przyjęcia. Naprawdę myślałem, że do tej pory rozwiązalibyśmy ten problem.
meawoppl,
7

Trzymałbym się z daleka od Fortan, a jeśli trzeba, używam dość nowej wersji (2003 zamiast 77). Wiele oprogramowania fizyki (w szczególności symulacje Monte Carlo) zostało napisane w Fortran, po prostu dlatego, że projekty rozpoczęto w latach 80.

Biorąc to pod uwagę, python i Fortran to dwa bardzo różne języki, a to, do czego powinny być używane, jest zupełnie inne. Python jest na wysokim poziomie i ogólnie nie tak szybki (w porównaniu z Fortran i C ++). Powodem tego, że jest tak często używany, jest to, że jest wystarczająco szybki dla większości rzeczy i ma doskonałe (zasilane Fortranem) biblioteki dla wielu (ale nie wszystkich) rzeczy, które chciałbyś robić. Ma również doskonały Matplotlib do kreślenia (więc nie ma potrzeby GNUplot) i możesz uzyskać całkiem przyzwoitą wydajność, używając rzeczy takich jak Cython do pisania drogich bitów. Jednak nie będzie tak szybki jak Fortran czy C ++, a równoległość jest dość straszna, co czyni ją nieodpowiednią do obliczeń numerycznych o wysokiej wydajności. Jeśli jednak możesz to zrobić, wywołując biblioteki Fortran lub C,

Fortran jest językiem nieco niższym. W przypadku liczb, obsługa bibliotek jest zaskakująco dobra, ale wciąż jest bardzo niska, co daje mnóstwo błędów, których można by uniknąć, takich jak przypadkowe przekazanie niewłaściwej wielkości tablicy do metody. Te błędy są trudne do znalezienia i możesz ich wcale nie zauważyć. Zaufaj mi, spędziłem sporo czasu pisząc Fortran 77.

C ++ jest (moim skromnym zdaniem) szczęśliwym medium. Dzięki bibliotekom takim jak Armadillo lub Eigen możesz uciec od dość wysokiego stylu kodowania przy jednoczesnym zachowaniu niskiego poziomu wydajności.

Mówiąc o wydajności, jedynym prawdziwym wyborem dla pytona numerycznego jest teraz CPython. Jeśli pobierzesz coś takiego jak WinPython , otrzymasz również większość potrzebnych bibliotek.

W przypadku Fortrana w systemie Windows sprawy są nieco trudniejsze. Poleciłbym przejście na Linuksa i użycie kompilatora gfortran lub Intels ifort. Z mojego doświadczenia wynika, że ​​ifort jest szybszy dla kodu numerycznego, ale jest bezpłatny tylko do niekomercyjnego, nieakademickiego użytku.

Podsumowując: O ile nie chcesz uruchamiać naprawdę ciężkich symulacji, python jest zdecydowanie łatwiejszym wyborem i znacznie przyjemniejszy w pracy. Powinien być również wystarczająco szybki dla większości projektów na poziomie studenta. Jeśli potrzebujesz lepszej wydajności, zacznij od przejrzenia marnotrawstwa bibliotek już napisanych i niech to decyduje o Twoim języku. Jeśli musisz pisać rzeczy od zera, użyj C ++.

Również ostrzeżenie: większość kodu napisanego przez fizyków jest dość straszna, prawdopodobnie dlatego, że fizycy mają skłonność do zakładania, że ​​programowanie jest łatwe i nie wymaga takiego samego rygoru, jakiego mogliby użyć w matematyce. Zastanów się, czy nie pójść na zajęcia lub kupić książkę, która uczy programowania.

Oświadczenie: Jestem fizykiem, który spędził sporo czasu z kodami Monte Carlo opartymi na Fortran 77 i obecnie całe przetwarzanie danych wykonuje w Pythonie.

LKlevin
źródło
Jeśli chodzi o równoległość, naukowcy z powodzeniem używali Pythona równolegle na dziesiątkach tysięcy rdzeni o dobrej wydajności równoległej. (Na przykład PyClaw został uruchomiony na całym Shaheen, który ma ponad 65 000 rdzeni.)
Geoff Oxberry
1
Cóż, jest to możliwe, ale o ile mi wiadomo, upewniając się, że część równoległa dzieje się poza CPython, co jest dużym wysiłkiem. Na przykład równoległa część PyClaw (PETSc) jest napisana w C. Inną alternatywą jest uruchamianie wielu instancji CPython, ale nie jest to zupełnie trywialne.
LKlevin
Większość aplikacji równoległych nie jest łatwa. Napisałeś: „Równoległość [Pythona] jest dość okropna, przez co nie nadaje się do obliczeń numerycznych o wysokiej wydajności”. Nikt nie pisze kodu o wysokiej wydajności w czystym języku Python. Uzasadnienie tej decyzji nie ma nic wspólnego z równoległością i nie unieważnia użycia Pythona jako języka interfejsu w obliczeniach o wysokiej wydajności, pod warunkiem, że jest on właściwie stosowany. Twój cytat to słaby człowiek, który łączy problemy paralelizmu, wysokiej wydajności i języków interpretowanych; nikt kompetentny nie zaprojektowałby takiej aplikacji.
Geoff Oxberry
Zgadzam się, że Python jest doskonałym językiem interfejsu do prawie każdego celu, ale odchodzi to od pytania. Większość aplikacji jest nietrywialna, problem polega na tym, że wszystkie przypadki równoległości, w tym te trywialne, nie są trywialne w pythonie. Może to być uciążliwe, jeśli Twój problem jest dobrze opisany w kategoriach operacji Numpy lub Cython. Nie, nie użyłbyś tego w klastrze 65000 rdzeni, ale możesz zaakceptować 2-krotny wzrost wydajności na 100 rdzeniach.
LKlevin
Jeśli chodzi o paralelizm, fajną rzeczą w Fortranie jest to, że oprócz MPI / OpenMP istnieją również macierze Co-array, które są teraz częścią standardu. Np. Zobacz to jolts.stanford.edu/72/…
stali
7

Python to bardzo wolny język wysokiego poziomu. W celu szybkiego łączenia liczb będziesz musiał napisać główne jądra obliczeń w językach niskiego poziomu, takich jak C / C ++, co oznacza, że ​​teraz musisz nauczyć się nie jednego, ale co najmniej dwóch języków. Będziesz także musiał poradzić sobie z dodatkowym bólem głowy związanym z debugowaniem / instalacją / konserwacją itp. Większość ludzi używa Pythona jako cukru składniowego, aby ukryć niedociągnięcia w C / C ++.

Modern Fortran (90 i nowsze) jest zarówno szybki, jak i wysoki z prawie składnią podobną do MATLAB. Możesz więc robić takie rzeczy jak:

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

lub

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

lub nawet prościej

indx=indxmap(indx,2)

itp.

W systemie Linux istnieje wiele bezpłatnych kompilatorów Fortran. używam

  1. GCC
  2. Solaris Studio
  3. Open64
  4. Intel (tylko do użytku niekomercyjnego)

Nie używam Mac / OSX, ale jest darmowy PGI.

I proszę, nie używaj FORTRAN 77. Nikt nie używa go do pisania nowego kodu.

Oświadczenie: osobiście spojrzałem na Pythona za napisanie własnego małego nieustrukturyzowanego kodu FE (zbudowany na bazie PETSc), ale ilość pracy / kodowania była czymś więcej niż tylko napisaniem zwykłego Fortran 95.

stali
źródło
1
Do tego dodam, że w Fortran 2003 można robić całkiem poważne programowanie obiektowe; patrz na przykład ten przewodnik . Używam go bardzo często we własnym kodzie i jest bardzo skuteczny w tym, co chcę robić. Wiele osób powie ci, żebyś tego unikał - mówię: zachowaj otwarty umysł, może ci się bardzo spodobać. Na pewno tak.
Daniel Shapero
4

Python jest bardzo praktyczny do pełnej analizy symulacji z dobrze udokumentowanymi wszechstronnymi pakietami: generowanie siatki, obliczanie tablic i obsługa struktury danych ( numpy i pandy ), a także wizualizacja danych za pomocą matplotlib. W przypadku złożonych symulacji z dużymi plikami wyników lepsza jest praca z pakietem VTK, który umożliwia eksportowanie danych do odczytu przez zaawansowane aplikacje typu open source (takie jak Paraview lub Visit)

Fortran był przez pewien czas preferowanym językiem dla różnych domen w symulacjach. Jest łatwo czytelny (choć mniej czytelny niż kod Pythona). Obsługa tablic jest jedną z mocnych stron języka, dość łatwą do zdefiniowania i użycia przy użyciu wszelkiego rodzaju operacji tablicowych. Przydaje się również podczas debugowania.

Porównanie sprowadza się do wydajności : wykonałem tylko obliczenia na dużą skalę przy użyciu skompilowanych języków (C ++ i Fortran 90), ale nigdy z Pythonem. Kolejny wątek zawiera więcej informacji na temat wydajności języków interpretowanych i skompilowanych: Jakiego języka powinienem używać, ucząc licencjackich kursów programowania komputerowego?

Osobiście lubię ogólnie pracować z Pythonem, szczególnie w przypadku przetwarzania końcowego. Programowanie w języku Python jest fajne!

SAAD
źródło
1
Wydajność jest prawie zawsze ważna. Brak uwagi na wydajność powoduje, że ludzie potrzebują 8 rdzeni z 16 GB pamięci RAM, aby sprawdzać pocztę e-mail i surfować po Internecie.
stali
Miałem nieszczęście, że musiałem czytać kod Pythona innych osób. Nie klasyfikowałbym kodu py jako łatwego do odczytania.
Biswajit Banerjee
@stali: Całkowicie się zgadzam
SAAD
1
@BiswajitBanerjee: nie jest niemożliwe napisanie skomplikowanego kodu w dowolnym języku, ale przynajmniej mogę łatwo zidentyfikować dane wejściowe i wyjściowe dowolnej funkcji, tutaj Fortran staje się okropny! :)
SAAD
3

W Pythonie nie potrzebujesz Gnuplot, możesz na przykład użyć matplotlib i / lub użyć powłoki IPython. IPython jest interaktywną powłoką Pythona, która w trybie% pylab zapewnia prawie takie same polecenia drukowania, jakie są dostępne w MATLAB.

Jest całkiem prawdopodobne, że obliczenia naukowe znacznie przestawią się z MATLAB na Python w ciągu następnych 5 lat.

Jolvi
źródło
Jedną z zalet Gnuplot jest to, że prawie zawsze jest instalowany na komputerach z systemem Linux (klaster / serwery itp.) I bardzo przydatny do szybkiego / brudnego viz. To jest jak vi dla viz.
stali
1

Nadal używałbym MATLAB-a, to wywołuje szybkie biblioteki matematyczne i nie zobaczysz dużej różnicy w wydajności, przechodząc na FORTRAN w systemie Windows. Jednocześnie będziesz mieć lepszą infrastrukturę w MATLAB do raportowania wyników i uruchamiania kodu. Minusem MATLAB jest jego koszt. FORTRAN jest w zasadzie darmowy i jest tam mnóstwo darmowych bibliotek.

FORTRAN jest bardzo łatwy do nauczenia i rozpoczęcia programowania. Zasadniczo robi to, co sugeruje nazwa: tłumaczy formuły na kod, który jest łatwy do odczytania i zrozumienia. Właśnie dlatego fizycy używali go często w dawnych czasach. Tak długo, jak większość twojego kodu dotyczy rozwiązywania problemów fizycznych (nie budowania GUI lub robienia innych fajnych rzeczy), kod FORTRAN będzie łatwy do utrzymania.

Poleciłbym Python tylko, jeśli lubisz programować. Pomyśl o tym: kiedy kodujesz rozwiązanie problemu fizyki, czy lubisz programować część rozwiązania? Jeśli tak, to Python jest opcją, ponieważ język jest znacznie lepszy niż MATLAB.

Aksakal
źródło
2
Twoje stwierdzenie na temat różnic w wydajności przy przechodzeniu z MATLAB na Fortran nie jest ogólnie prawdą. Fortran jest świetny, jeśli piszesz kod, dla którego tablice są naturalnie dobrą strukturą danych, jeśli możesz żyć z tym, jak obsługuje I / O i jeśli ma biblioteki, których potrzebujesz. Biblioteki numeryczne w Pythonie nakładają się na siebie pod względem funkcjonalności z MATLAB i łatwiej jest mi pisać interfejsy Python do kodu C niż interfejsy MATLAB do kodu C.
Geoff Oxberry
Czasami można nie zobaczyć wielkiej różnicy. Niedawno przepisałem program do symulacji fizyki z Matlaba (używając pakietu bvp6c wewnętrznie) na Fortran 2008 (używając pakietu bvp_solver wewnętrznie), a czas wykonania spadł do zaledwie 1,4% po zmianie, mimo że nie zmieniłem algorytmów lub ogólna struktura programu. Było to bardzo zauważalne ulepszenie w przypadku symulacji, która wymagała około 3,5 dnia na punkt danych do zbieżności .
jabirali,