Utilizzo di linguaggi di programmazione non convenzionali per il calcolo scientifico [chiuso]


22

Nota: il seguente post può contenere opinioni controverse, quindi tieni presente che sono solo mie opinioni e non intendono offendere nessuno.

Sto programmando in un modo o nell'altro dal 1999. Inizialmente ho usato R, e poi, intorno al 2004, sono passato principalmente a Python.

Per molte applicazioni scientifiche, ad esempio, la simulazione, incluse cose come MCMC, sia R che Python sono troppo lente e devono essere velocizzate. Il solito modo di farlo è estendere con C o C ++. Sia per R che per Python, questo è quello che ho fatto, usando l'API C di R con C ++ e la libreria Boost Python con Python.

Tuttavia, per vari motivi, questa combinazione non è la soluzione ideale. Cosa è importante nella programmazione, in particolare gli algoritmi? Espressività e velocità, che sono ovviamente correlate. Più una lingua è espressiva, più velocemente si può scrivere in essa.

1) Per quanto riguarda l'espressività, né R né Python sono davvero ideali per scrivere algoritmi scientifici a mio avviso. Non si associano strettamente all'algoritmo sottostante. Tuttavia, sono entrambi notevolmente migliori del C ++.

2) Mi piace scrivere in Python, che è un linguaggio piacevole, anche se come notato sopra non è l'ideale per il lavoro algoritmico. Tuttavia, quando si deve lavorare con una combinazione Python / C ++ a causa di problemi di velocità, questo mix diventa notevolmente meno piacevole con cui lavorare. Quello che succede di solito è che scrivo per la prima volta in Python, e una volta che ho qualcosa che funziona bene, spesso scopro che è troppo lento (per un valore soggettivo troppo lento). Devo quindi decidere se dedicare una quantità irragionevole di tempo a riscriverlo in C ++ o sopportare la lentezza. Con il senno di poi spesso sento che avrei potuto fare meglio a sopportare la lentezza, soprattutto perché gli speedups ottenuti sono imprevedibili. Inoltre, l'interfaccia Boost Python tra i due è un notevole mal di testa di manutenzione, e avere il codice in due lingue molto diverse incollate insieme in questo modo è solo fonte di distrazione. Nessuna critica al proposito di Boost Python, è un'interfaccia potente come si potrebbe immaginare, e praticamente funziona quasi sempre.

Ora, in un mondo ideale, con tempo e risorse illimitate, nessuno di questi problemi sarebbe un grosso problema. Tuttavia, in progetti scientifici a cui ho lavorato, ho avuto la seguente esperienza.

A prescindere dal fatto che io abbia o meno dei collaboratori nel progetto, mi sembra sempre di finire facendo la stragrande maggioranza dell'informatica. In un totale di 5 progetti significativi, ho avuto una partecipazione sostanziale da una sola persona a un progetto. Quella persona ha fatto più che tirare il suo peso; ha fatto tanto quanto me o più. Tuttavia, in tutti gli altri casi, compresi i progetti con più collaboratori, ho svolto (praticamente) tutto il lavoro di calcolo. Mentre posso dire di non essere stato benedetto con i migliori collaboratori (sembra essere un misto di pigrizia e incompetenza), non mi è chiaro se questo stato di cose possa cambiare in futuro.

Il lavoro scientifico computazionale è un enorme sforzo e, se non riesco a cambiare il comportamento dei miei collaboratori, posso cambiare il mio modo di lavorare. Il miglioramento più importante sarebbe quello di fare le cose più rapidamente. Il che mi porta alla considerazione principale qui, che può aiutare il passaggio dalle lingue a qualcosa di meno ortodosso. Sulla base di ricerche passate, i candidati più probabili in ordine di probabilità sono Common Lisp e Ocaml. Ci sto pensando da anni, ma recentemente ci ho pensato più seriamente.

Per quanto ne so, poche persone usano CL o Ocaml per il calcolo scientifico. Durante la ricerca di questo sito, ho trovato due riferimenti a CL (uno era mio) e uno a Ocaml (mio). Nel corso degli anni ho avuto un paio di contatti incoraggianti con persone avventurose che lavorano ai margini. Nel 2008 mi sono imbattuto in una recensione del libro "Practical Common Lisp" di Peter Seibel (che possiedo), di Tamas K. Papp. Ciò ha attirato la mia attenzione, poiché era una delle poche menzioni dell'informatica scientifica per Lisp che avevo trovato in rete. Ho scritto a Tamas, che ha immediatamente risposto in modo utile e incoraggiante. Per citare lui

La mia produttività di programmazione probabilmente è aumentata di dieci volte con Lisp, ma ci sono voluti circa un anno e sto ancora imparando (ma dopo 2 mesi stavo andando abbastanza bene). Quindi, se stai lavorando a qualcosa di critico in termini di tempo, rimanda il passaggio.

Dovresti considerare di chiedere alla gente di cll, non sono il solo a sapere queste cose, altri fanno calcoli scientifici su Lisp.

Ha anche un blog e una pagina GitHub .

Un'altra persona con cui ho avuto una breve corrispondenza (nel dicembre 2006) è stata Ira Kalet , che ha usato Common Lisp nel contesto dell'oncologia delle radiazioni.

Forse ci sono altri che fanno calcoli scientifici su Lisp, ma non conosco nessuno.

Il problema più comune che le persone citano con CL è la mancanza di librerie. Questo è un grave problema nell'informatica di uso generale, ma potrebbe non esserlo tanto nell'informatica scientifica, in particolare dalle implementazioni da zero degli algoritmi. In particolare, riesco a cavarmela per la maggior parte del tempo con una libreria matematica di base, tra cui funzioni di distribuzione di probabilità, una libreria di array multidimensionale e un set di contenitori di base, ad esempio mappa, set, elenco ecc., Come si trova nelle librerie standard C ++ e Python.

So ancora meno di Ocaml di quanto non faccia a proposito di CL, ma lo ho lanciato in alternativa. È presumibilmente molto veloce, ha un'implementazione gratuita da parte dei ricercatori francesi e sembra la più praticabile della famiglia di lingue ML per il calcolo scientifico.

Per concludere, mi chiedo se gli altri hanno esperienza con questo, e quali pensieri hanno, se ce ne sono.

EDIT: Sono principalmente interessato all'esperienza di prima mano, nel contesto delle questioni di cui ho discusso sopra. Ad esempio, se usavi Python e C ++ (o R e C ++) e passavi a un linguaggio più oscuro, sarei molto interessato a conoscere le tue esperienze.


2
Lo scambio di stack è per porre domande, non per pubblicare storie di vita! La tua domanda sembra essere "Esistono progetti di calcolo scientifico che usano Common Lisp o OCaml", giusto?
khinsen,

4
D'accordo, questo sembra un po 'più simile a un post sul blog, ma mi piace la premessa. Hai qualche possibilità di provare a ridurlo a 2-3 paragrafi?
Aron Ahmadia,

1
Anche d'accordo. Il commento e l'esperienza personale sono buoni quando supportano la domanda principale; troppi dettagli possono inondare i punti principali. Se riesci a condensare la tua domanda, penso che sarebbe più facile da leggere e otterrebbe risposte più mirate e di qualità superiore.
Geoff Oxberry,

1
@FaheemMitha: Nel "mondo ideale" di cui parli a metà strada sarebbe tutto un assemblaggio ottimizzato a mano ... Mi sembra triste!
meawoppl,

3
@FaheemMitha: La cosa migliore che penso che potresti fare per migliorare la tua domanda è chiarire la domanda che stai ponendo. Sembra che tu stia raccontando una storia delle tue esperienze (che va bene), e alla fine, seppellisci la domanda come una dichiarazione alla fine della tua storia. ("Per concludere, mi chiedo ...") La cosa migliore che puoi fare è trasformare quella parte in una domanda, così le persone che scremano la tua domanda possono facilmente identificare ciò che stai chiedendo. Ho dovuto tornare un paio di volte per capirlo.
Geoff Oxberry,

Risposte:


18

Abbiamo sviluppato Julia esattamente per i motivi sollevati. Non esisteva un buon linguaggio di calcolo scientifico di alto livello che fornisse anche prestazioni abbastanza buone da non dover continuare a riscrivere parti del codice in C / Fortran. Il design di julia ha una discreta influenza lisp, quindi potresti trovarlo di tuo gradimento, mentre i tuoi collaboratori possono trattarlo come un matlab o R se non si interessano delle parti funzionali. Il rovescio della medaglia è che la lingua è nuova e non ha ancora tutte le librerie necessarie per l'uso quotidiano.

Mark, mi piacerebbe aggiungere Julia al tuo benchmark per vedere come andiamo. Salta sulla nostra mailing list e facci sapere cosa ti piacerebbe vedere in julia in modo che ti sia più utile.


Sembra bellissimo! Lo verificherò sicuramente per il mio lavoro. Attualmente uso Python per tutto il mio lavoro in materia teorica condensata, solo perché il tempo guadagnato avendo un codice C ++ veloce è negato in primo luogo dal tempo impiegato a scrivere in C ++ :)
Lagerbaer,

9

La velocità, le dimensioni e l'affidabilità dei linguaggi di programmazione fanno davvero un buon lavoro nel riassumere molte preoccupazioni diverse espresse nella tua "domanda". Confronta la velocità e le dimensioni della base di codice di un gruppo di implementazioni degli stessi benchmark in 33 lingue!

Sono diventato un amante di Python principalmente perché è molto più comune avere un tempo di elaborazione in eccesso rispetto al tempo in eccesso per programmare. Sono più che disposto a sperperare i cicli della CPU piuttosto che sacrificare un cuneo di tempo che potrebbe essere dedicato a qualcosa di più interessante.

Inoltre, +1 su Julia. Penso che potrei passare ad esso quando diventa un po 'più stabile e ampiamente supportato, cioè quando i moduli standard sono avvolti per il lavoro che mi piace fare.


4

Per applicazioni scientifiche di OCaml, vedere ad esempio

Per Lisp nella scienza, vedi ad esempio

Sono sicuro che ci sono molti altri riferimenti. Tuttavia, non posso citare alcun grande progetto di ricerca in cui sia stato svolto un lavoro computazionale in OCaml o Lisp. Scegliere uno dei due significa lavorare in relativo isolamento.

Potresti anche essere interessato a Julia , una nuova lingua per il calcolo scientifico attualmente in fase di sviluppo, con chiare influenze Lisp.


1
Avrei forse dovuto chiarire che sono principalmente interessato all'esperienza di prima mano. Modificherò la mia domanda per riflettere questo.
Faheem Mitha,
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.