Python vs FORTRAN


17

Quale è meglio: FORTRAN o Python? E credo che in entrambi i casi tu abbia bisogno di Gnuplot, vero?

Al momento sto lavorando su una macchina Windows.

Vorrei usarlo per ottenere soluzioni numeriche per problemi di fisica, tra cui simulazioni Monte-Carlo, integrazione numerica e differenziazione, dinamica molecolare, ecc.

Ho visto un corso di fisica computazionale che introduce sia FORTRAN (77 credo) sia Python. Sto pensando di iniziare con uno e poi imparare l'altro, ma non so quale transizione potrebbe essere la più semplice.

Inoltre quali compilatori consiglieresti?

La domanda di base per me si riduce a: qual è il più facile da imparare, qual è il più veloce, qual è il più facile da usare e soprattutto quale è il più usato (quindi un confronto di questi 4)? E accanto a ciò, quali sono i compilatori più comuni (gratuiti o a pagamento) in uso? Attualmente sto valutando la conversione di un vecchio laptop (i primi dual core Intel) in Linux; speriamo che sia abbastanza veloce.

Grazie mille per le risposte finora! Le risposte che sono in linea con quello che sto cercando sono quelle di LKlevin e SAAD.

Conosco le basi di C ++, Maple e padroneggio MATLAB e Mathematica9 quasi completamente se questo è d'aiuto.


12
Devi davvero essere più specifico; è come chiedere "qual è il migliore: un martello o un cacciavite?". Dai un'occhiata a scicomp.stackexchange.com/questions/11006 (si tratta di C ++ invece di Fortran, ma la maggior parte dei punti dovrebbe essere applicata allo stesso modo).
Christian Clason,

@ChristianClason, punto giusto: p
Nick,

Grazie per la modifica, anche se questo non restringe le cose. Non sono sicuro di cosa si possa dire di più di quanto sia già stato dato come risposta alla domanda sopra collegata.
Christian Clason,

2
Inoltre, la domanda sui compilatori è un problema separato e dovrebbe essere una domanda separata. (Altrimenti le persone che hanno familiarità con Fortran ma non sono interessate a Python non lo vedranno.) Alcuni consigli sono già stati forniti in scicomp.stackexchange.com/questions/8617 .
Christian Clason,

1
Se conosci matlab, puoi imparare la maggior parte degli algoritmi numerici implementandoli lì, anche se le tue prestazioni saranno quasi sempre peggiori delle routine di matlab integrate. Da lì puoi decidere quali sono le tue esigenze di performance e passare a una libreria / lingua più efficiente.
Godric Seer,

Risposte:


29

Facilità di apprendimento

Python e Fortran sono entrambi lingue relativamente facili da imparare. Probabilmente è più facile trovare buoni materiali didattici Python che buoni materiali didattici Fortran perché Python è usato più ampiamente e Fortran è attualmente considerato un linguaggio "specializzato" per il calcolo numerico.

Credo che il passaggio da Python a Fortran sarebbe più semplice. Python è un linguaggio interpretato, quindi il numero di passaggi necessari per far funzionare il tuo primo programma è inferiore (apri l'interprete, digita print("Hello, world!")al prompt) rispetto a Fortran (scrivi un programma "Hello world", compila, esegui). Penso anche che ci siano materiali migliori per insegnare lo stile orientato agli oggetti in Python che in Fortran, e su GitHub è disponibile più codice Python che codice Fortran.

Alzarsi e funzionare su Windows

L'installazione di Python dovrebbe essere meno dolorosa; ci sono distribuzioni di Windows disponibili. Consiglio di utilizzare una distribuzione scientifica come Anaconda o Enthought Canopy. Non c'è davvero un compilatore, di per sé; l'interprete assume quel ruolo. Ti consigliamo di utilizzare un interprete basato su CPython, perché ci sono più librerie numeriche disponibili e interagisce bene con C, C ++ e Fortran. Altre implementazioni di interpreti includono Jython e PyPy.

Su un computer Windows, l'installazione di un compilatore Fortran sarà fastidiosa. Tipici compilatori da riga di comando sono programmi come gfortran, ifort (da Intel; gratuito per uso personale, altrimenti costa denaro) e pgfortran (da IGP; versioni di prova gratuite, altrimenti costa denaro). Per installare questi compilatori, potrebbe essere necessario installare una sorta di livello di compatibilità di tipo UNIX / POSIX, come Cygwin o MinGW. Ho trovato doloroso lavorare con, ma ad alcune persone piace quel flusso di lavoro. Puoi anche installare un compilatore con una GUI, come Visual Fortran (di nuovo, dovresti pagare per una licenza).

Su Linux, sarà più semplice installare Python e compilatori; Vorrei comunque installare Anaconda o Enthought Canopy come distribuzione Python.

Velocità: un compromesso tra produttività e prestazioni

Usando Python (o MATLAB, Mathematica, Maple o qualsiasi linguaggio interpretato), si rinuncia alle prestazioni per la produttività. Rispetto a Fortran (o C ++, C o qualsiasi altro linguaggio compilato), si scriveranno meno righe di codice per svolgere la stessa attività, il che significa generalmente che ci vorrà meno tempo per ottenere una soluzione funzionante.

L'efficace penalità prestazionale per l'utilizzo di Python varia e viene mitigata delegando compiti intensivamente computazionali a linguaggi compilati. MATLAB fa qualcosa di simile. Quando si esegue una moltiplicazione di matrici in MATLAB, chiama BLAS; la penalità delle prestazioni è praticamente zero e non è stato necessario scrivere Fortran, C o C ++ per ottenere prestazioni elevate. Una situazione simile esiste in Python. Se puoi usare le librerie (ad esempio NumPy, SciPy, petsc4py, dolfin di FEniCS, PyClaw), puoi scrivere tutto il tuo codice in Python e ottenere buone prestazioni (una penalità del 10-40%) perché tutto il calcolo le parti intensive sono chiamate a librerie di lingue compilate rapidamente. Tuttavia, se dovessi scrivere tutto in puro Python, la penalità prestazionale sarebbe un fattore di 100-1000x. Quindi, se volevi usare Python e dovevi includere un'abitudine, computazionalmente intensiva, faresti meglio a scrivere quella parte in un linguaggio compilato come C, C ++ o Fortran, quindi a racchiuderlo con un'interfaccia Python. Ci sono librerie che facilitano questo processo (come Cython e f2py) e tutorial per aiutarti; generalmente non è oneroso.

Ambito di utilizzo

Python è usato più ampiamente nel complesso come linguaggio generico. Fortran è in gran parte limitato al calcolo numerico e scientifico ed è principalmente in concorrenza con C e C ++ per gli utenti di quel dominio.

Nella scienza computazionale, Python in genere non compete direttamente con i linguaggi compilati a causa delle penalità prestazionali che ho citato. Utilizzerai Python nei casi in cui desideri una produttività elevata e le prestazioni siano una considerazione secondaria, come ad esempio nella prototipazione di algoritmi a elaborazione numerica, elaborazione dei dati e visualizzazione. Utilizzeresti Fortran (o un altro linguaggio compilato) quando hai una buona idea di come dovrebbe essere il tuo algoritmo e il design dell'applicazione, sei disposto a dedicare più tempo alla scrittura e al debug del codice e le prestazioni sono fondamentali. (Ad esempio, le prestazioni sono un passaggio limitante nel processo di simulazione, oppure sono un risultato chiave nella ricerca.) Una strategia comune è quella di mescolare Python e un linguaggio compilato (di solito C o C ++, ma è stato utilizzato anche Fortran), e utilizzare il linguaggio compilato solo per le parti del codice più sensibili alle prestazioni; il costo di sviluppo è, ovviamente, che è più difficile scrivere ed eseguire il debug di un programma in due lingue rispetto a un programma in una sola lingua.

In termini di parallelismo, l'attuale standard MPI (MPI-3) ha attacchi Fortran e C nativi. Lo standard MPI-2 aveva collegamenti C ++ nativi, ma MPI-3 no, e dovresti usare i collegamenti C. Esistono collegamenti MPI di terze parti, come mpi4py. Ho usato mpi4py; funziona bene ed è semplice da usare. Per il parallelismo su larga scala (decine di migliaia di core), probabilmente vorresti usare un linguaggio compilato perché cose come il caricamento dinamico dei moduli Python ti morderanno nel culo su larga scala se lo fai in modo ingenuo. Ci sono modi per aggirare quel collo di bottiglia, come dimostrato dagli sviluppatori di PyClaw, ma è più semplice evitarlo.

Opinioni personali

Ho circa un decennio di esperienza in Fortran 90/95 e ho anche programmato in Fortran 2003. Ho circa cinque anni di esperienza nella programmazione in Python. Uso Python molto più di quanto non usi Fortran perché, francamente, faccio di più in Python. La maggior parte del lavoro che devo svolgere non richiede importanti risorse di supercalcolo e in genere non vale la pena ri-svilupparla in un'altra lingua, quindi Python va bene per risolvere ODE e PDE. Se devo usare un linguaggio compilato, userò C, C ++ o Fortran, in questo ordine.

La maggior parte del codice Fortran che ho visto è stato brutto, principalmente perché la maggior parte della comunità scientifica computazionale sembra inconsapevole o avversa alle migliori pratiche scoperte dagli ingegneri del software negli ultimi 30 anni. Vale a dire: non esiste un buon framework di unit test in Fortran. (Il migliore in cui mi sono imbattuto è FUnit, della NASA, e non è più gestito.) Ci sono alcuni buoni framework di test di unità Python, buoni generatori di documentazione Python e in genere molti esempi migliori di buone pratiche di programmazione.


Risposta molto bella e completa :). Ho installato Linux ieri dove il compilatore python era già presente. Ora mi chiedevo se esiste un modo semplice per condividere file tra la mia macchina Linux e Windows? Ho notato che ogni volta che utilizzo uno stick per trasferire i dati, sia la macchina Windows che Linux ignorano alcune parti su de stich (che è formattato nel formato NFTS).
Nick,

e il mio ultimo problema è stato risolto usando il formato FAT32 (almeno finora).
Nick,

NB: FAT32 ha una dimensione massima del file limitata.
meawoppl,

@Meawoppl, esiste un modo più conveniente per scambiare file tra Linux e Windows? Forse dropbox allora? Esiste anche una soluzione basata su hardware?
Nick,

Tieni i tuoi file sotto i 4 GB: P Davvero, non conosco una buona soluzione. C'è anche un po 'di sregolatezza nelle convenzioni sui nomi dei file. Ricordo di aver rotto il supporto di Windows una volta nominando un file <3.txt che rendeva M $ piuttosto triste. Il supporto NTFS in Linux è abbastanza buono ora, ma è in particolare un no-go totale in OSX. Pensavo davvero che avremmo risolto questo problema ormai.
meawoppl,

7

Starei alla larga da Fortan o, se necessario, utilizzerei una versione ragionevolmente nuova (2003 anziché 77). Molti software di fisica (simulazioni Monte Carlo in particolare) sono scritti in Fortran, semplicemente perché i progetti sono stati originariamente avviati negli anni '80.

Detto questo, Python e Fortran sono due linguaggi molto diversi, e ciò per cui dovrebbero essere usati è piuttosto diverso. Python è di alto livello e in generale non così veloce (rispetto a Fortran e C ++). Il motivo per cui viene usato così tanto è che è abbastanza veloce per la maggior parte delle cose e ha librerie eccellenti (basate su Fortran) per molte (ma non tutte) le cose che vorresti fare. Ha anche l'eccellente Matplotlib per la stampa (quindi non è necessario GNUplot) e puoi ottenere prestazioni abbastanza decenti usando cose come Cython per scrivere bit costosi. Tuttavia, non sarà veloce come Fortran o C ++ e la parallelizzazione è piuttosto terribile, rendendola inadeguata per il calcolo numerico ad alte prestazioni. Se ciò che desideri può essere gestito chiamando Fortran o le librerie C,

Fortran è un linguaggio di livello leggermente inferiore. Per i valori numerici il supporto della libreria è sorprendentemente buono, ma è ancora di livello molto basso, dandoti un mucchio di bug che potresti altrimenti evitare, come passare accidentalmente la dimensione dell'array sbagliata a un metodo. Questi bug sono difficili da trovare e potresti non notarli affatto. Fidati di me, ho passato parecchio tempo a scrivere Fortran 77.

Il C ++ è (secondo la mia modesta opinione) un mezzo felice. Con librerie come Armadillo o Eigen, puoi cavartela con uno stile abbastanza alto di codifica ottenendo uno stile di basso livello di prestazioni.

A proposito di prestazioni, l'unica vera scelta per il pitone numerico in questo momento è CPython. Se scarichi qualcosa come WinPython otterrai anche la maggior parte delle librerie di cui hai bisogno.

Per Fortran su Windows, le cose sono un po 'più difficili. Consiglierei di passare a Linux e di usare il compilatore ifort gfortran o Intels. Ifort tende ad essere più veloce per il codice numerico nella mia esperienza, ma è gratuito solo per uso non commerciale, non accademico.

Riassumendo: a meno che tu non voglia eseguire simulazioni davvero pesanti, python è di gran lunga la scelta più semplice e molto più divertente con cui lavorare. Dovrebbe anche essere abbastanza veloce per la maggior parte dei progetti a livello di studente. Se hai bisogno di prestazioni migliori, inizia guardando le quantità di librerie già scritte e lascia che decida la tua lingua. Se devi scrivere cose da zero, usa C ++.

Anche un avvertimento: la maggior parte del codice scritto dai fisici è abbastanza terribile, presumibilmente perché i fisici hanno la tendenza ad assumere che la programmazione sia facile e non richieda lo stesso rigore che potrebbero usare in matematica. Prendi in considerazione l'idea di frequentare un corso o acquistare un libro che insegna la programmazione.

Disclaimer: sono un fisico che ha trascorso parecchio tempo con i codici Monte Carlo basati su Fortran 77 e attualmente esegue tutta la sua elaborazione dei dati in Python.


Per quanto riguarda la parallelizzazione, i ricercatori hanno usato Python in parallelo con successo su decine di migliaia di core con una buona efficienza parallela. (Ad esempio, PyClaw è stato eseguito su tutti gli Shaheen, che sono più di 65.000 core.)
Geoff Oxberry,

1
Bene è possibile, ma per quanto ne so solo assicurandomi che la parte parallela avvenga al di fuori di CPython, il che è uno sforzo considerevole. La parte parallela di PyClaw (PETSc) è scritta in C per esempio. Un'altra alternativa è l'esecuzione di più istanze di CPython, ma non è esattamente banale.
LKlevin

La maggior parte delle applicazioni parallele non sono banali. Hai scritto "La parallelizzazione [Python] è piuttosto terribile, rendendola inadeguata per il calcolo numerico ad alte prestazioni". Nessuno scrive codice ad alte prestazioni in puro Python. Il ragionamento per questa decisione non ha nulla a che fare con il parallelismo e non invalida l'uso di Python come linguaggio di interfaccia nel calcolo ad alte prestazioni, purché sia ​​usato in modo appropriato. La tua citazione è un uomo di paglia che unisce le problematiche del parallelismo, delle alte prestazioni e dei linguaggi interpretati; nessuno competente progetterebbe un'applicazione del genere.
Geoff Oxberry

Sono d'accordo che Python è un linguaggio di interfaccia eccellente per quasi tutti gli scopi, ma questo si sta allontanando dalla domanda. La maggior parte delle applicazioni non è banale, il problema qui è che tutti i casi di parallelizzazione, compresi quelli banali, non sono banali in Python. Questo può essere un fastidio se il tuo problema è altrimenti ben descritto in termini di operazioni di Numpy o Cython. No, non lo utilizzeresti su un cluster 65000 core, ma potresti accettare l'hit di prestazioni 2x su un core 100.
LKlevin,

Parallelismo scritto, la cosa bella di Fortran è che oltre a MPI / OpenMP ci sono anche Co-array che ora fanno parte dello standard. Ad esempio, vedi questo jolts.stanford.edu/72/…
stali

7

Python è un linguaggio molto lento e di alto livello. Per un veloce scricchiolio dei numeri dovrai scrivere i kernel di calcolo principali in lingue di basso livello come C / C ++, il che significa che ora devi imparare non una ma almeno due lingue. Dovrai anche occuparti di ulteriori mal di testa associati a debug / installazione / manutenzione, ecc. La maggior parte delle persone usa Python come zucchero sintattico per nascondere le brevi carenze di C / C ++.

Il moderno Fortran (90 e successivi) è veloce e di alto livello con una sintassi simile a MATLAB. Quindi puoi fare cose come:

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

o

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

o anche più semplice

indx=indxmap(indx,2)

eccetera.

Su Linux sono disponibili numerosi compilatori Fortran gratuiti. Io uso

  1. GCC
  2. Solaris Studio
  3. Open64
  4. Intel (solo per uso non commerciale)

Non uso Mac / OSX ma c'è IGP gratuita.

E per favore non usare FORTRAN 77. Nessuno lo usa per scrivere un nuovo codice.

Disclaimer: ho guardato personalmente Python per aver scritto il mio piccolo codice FE non strutturato (costruito in cima a PETSc) ma la quantità di lavoro / codifica coinvolta era molto più che scrivere semplicemente Fortran 95.


1
A questo aggiungerei che puoi fare una programmazione orientata agli oggetti piuttosto seria in Fortran 2003; vedi ad esempio questa guida . L'ho usato molto nel mio codice ed è stato molto efficace per quello che voglio fare. Molte persone ti diranno di evitarlo - dico di tenere la mente aperta, potrebbe piacerti molto. Certamente.
Daniel Shapero,

4

Python è molto pratico per l'analisi di simulazione completa con pacchetti versatili ben documentati: generazione della griglia, calcolo dell'array e gestione della struttura dei dati ( numpy e panda ) nonché visualizzazione dei dati con matplotlib. Per simulazioni complesse con file di risultati di grandi dimensioni, è ancora meglio lavorare con il pacchetto VTK che consente di leggere i dati di esportazione da applicazioni open source avanzate (come Paraview o Visit)

Fortran è da qualche tempo la lingua preferita per diversi domini nelle simulazioni. È facilmente leggibile (meno leggibile del codice Python). La gestione dell'array è uno dei punti di forza del linguaggio, abbastanza facile da definire e utilizzare in uso tutti i tipi di operazioni dell'array. È utile anche durante il debug.

Il confronto si riduce alle prestazioni : ho fatto solo calcoli su larga scala usando linguaggi compilati (C ++ e Fortran 90) ma mai con Python. Un altro thread fornisce ulteriori informazioni sulle prestazioni relative alle lingue interpretate e compilate: quale lingua dovrei usare quando insegno un corso di laurea in programmazione per computer?

Personalmente, mi piace lavorare con Python in generale, specialmente per la post-elaborazione. La programmazione Python è divertente!


1
Le prestazioni sono quasi sempre importanti. La mancanza di attenzione alle prestazioni è il motivo per cui le persone hanno bisogno di 8 core con 16Gb di RAM per controllare la posta elettronica e navigare sul web.
Stali,

Ho avuto la sfortuna di dover leggere il codice Python degli altri. Non classificherei il codice Py come facile da leggere.
Biswajit Banerjee,

@stali: sono totalmente d'accordo
SAAD

1
@BiswajitBanerjee: non è impossibile scrivere codice complicato con qualsiasi lingua, ma almeno posso facilmente identificare input e output di qualsiasi funzione, ecco dove Fortran diventa orribile! :)
SAAD,

3

Con Python non hai bisogno di Gnuplot, puoi usare, ad esempio, matplotlib e / o usare la shell IPython. IPython è una shell Python interattiva che, in modalità% pylab, fornisce praticamente gli stessi comandi di stampa disponibili in MATLAB.

È molto probabile che il calcolo scientifico cambierà notevolmente da MATLAB a Python nei prossimi 5 anni.


Uno dei vantaggi di Gnuplot è che è quasi sempre installato su macchine Linux (cluster / server ecc.) E molto utile per un rapido / sporco. È come vi per Viz.
Stali,

1

Continuerei a usare MATLAB, chiama le librerie matematiche veloci e non vedrai molte differenze nelle prestazioni passando a FORTRAN su Windows. Allo stesso tempo avrai una migliore infrastruttura in MATLAB per la segnalazione dei risultati e l'esecuzione del tuo codice. L'aspetto negativo di MATLAB è il suo costo. FORTRAN è sostanzialmente gratuito e ci sono un sacco di librerie gratuite là fuori.

FORTRAN è molto facile da imparare e inizia a programmare. Fondamentalmente fa ciò che suggerisce il nome: traduce le tue formule in codice, che è facile da leggere e capire. Ecco perché i fisici lo usavano molto ai vecchi tempi. Fintanto che la maggior parte del codice riguarda la risoluzione di problemi di fisica (non la creazione di GUI o altre attività interessanti), il codice FORTRAN sarà facile da mantenere.

Consiglierei Python solo se ti piace programmare. Pensa a questo: quando codifichi una soluzione al problema di fisica ti piace programmare parte della soluzione? Se lo fai, allora Python è un'opzione, perché la lingua è molto migliore di quella di MATLAB.


2
La tua affermazione sulle differenze di prestazioni nel passaggio da MATLAB a Fortran non è vera in generale. Fortran è ottimo se stai scrivendo un codice per il quale gli array sono una struttura di dati naturalmente buona, se riesci a convivere con come gestisce l'I / O e se ha le librerie di cui hai bisogno. Le librerie numeriche in Python si sovrappongono pesantemente in funzionalità con MATLAB, e trovo più facile scrivere interfacce Python nel codice C che interfacce MATLAB nel codice C.
Geoff Oxberry,

A volte si fa vedere molta differenza. Recentemente ho riscritto un programma di simulazione fisica da Matlab (usando il pacchetto bvp6c internamente) a Fortran 2008 (usando il pacchetto bvp_solver internamente) e il tempo di esecuzione è sceso all'1,4% dopo il passaggio, anche se non ho cambiato gli algoritmi o struttura generale del programma. Per una simulazione che ha usato per richiedere ~ 3,5 giorni per ogni punto dati a convergere, questo è stato un molto notevole miglioramento.
jabirali,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.