I miei 2 centesimi.
Penso che sia più facile scrivere in generale su questo, piuttosto che solo su C / C ++. Innanzitutto, le librerie in linguaggi come Python non sono necessariamente utilizzate per ottenere un vantaggio in termini di velocità, anche se ciò è una conseguenza. Penso che
@ David abbia trattato abbastanza bene i motivi.
Prendendolo dall'alto, l'implementazione del linguaggio determina in una certa misura a quali librerie hai accesso. I linguaggi comunemente usati nella scienza computazionale includono C, C ++, Python, Perl, Java, Fortran e R. Esempi meno comuni potrebbero essere Ocaml e Common Lisp. Ora, poiché la maggior parte di questi linguaggi sono scritti in C, hanno un'interfaccia di funzione esterna naturale con C. Tuttavia, non è così facile chiamare, per esempio, una libreria Perl da Python o viceversa. Quindi in pratica le persone tendono a farlo
Utilizzare una libreria scritta nel loro linguaggio di implementazione, di solito qualcosa che fa parte delle librerie standard, o altrimenti ampiamente disponibile, o
Chiamare una libreria C / C ++ attraverso le lingue FFI. Ciò presuppone che un wrapper non esista già, poiché in tal caso non è facilmente distinguibile da (1).
(2) di solito è più difficile, perché devi avvolgere tu stesso la funzione C / C ++. Inoltre, è necessario raggruppare la libreria o aggiungere una dipendenza aggiuntiva. Per tale motivo, è più probabile che le persone utilizzino le librerie di lingue integrate anziché utilizzare GSL, ad esempio, che si trova in C.
Per routine molto generiche, ad esempio generare campioni casuali da distribuzioni o routine numeriche di base come la quadratura di integrali, è facile e comune riutilizzare alcune librerie. Man mano che la funzionalità che si sta tentando di implementare diventa più complessa, diventa esponenzialmente più improbabile che si trovi la funzione esatta che si desidera in un'altra libreria e, anche se lo si fa, si può dedicare molto tempo alla ricerca e infine adattare la funzione come necessario (lo stile / il design del codice potrebbe essere un problema ad esempio). E come discusso sopra, si ha accesso solo a un sottoinsieme delle librerie là fuori. D'altra parte, implementare un algoritmo se è complesso e non il focus principale può essere scoraggiante, e ovviamente uno deve affrontare quei fastidiosi problemi di velocità.
Quindi, questo diventa un problema di ottimizzazione nell'analisi costi / benefici. La mia esperienza è che anche per tecniche relativamente standard come MCMC, di solito finisco per scrivere il mio codice, perché si adatta meglio a come sto progettando il software generale.
Certo, anche se finisci per non usare il codice, è possibile imparare dal codice di altre persone. Tuttavia, non so quanto spesso gli scienziati si preoccupino di farlo. La mia impressione è che leggere il codice di altre persone per imparare sia più una cosa da ingegnere del software.