Meus 2 centavos.
Eu acho que é mais fácil escrever geralmente sobre isso, ao invés de apenas sobre C / C ++. Primeiro, bibliotecas em linguagens como Python não são necessariamente usadas para obter um benefício de velocidade, mesmo que isso seja uma consequência. Acho que o
@David cobriu muito bem os motivos.
Levando isso de cima, a implementação da linguagem, em certa medida, determina a quais bibliotecas você tem acesso. Linguagens comumente usadas na ciência computacional incluem C, C ++, Python, Perl, Java, Fortran e R. Exemplos menos comuns podem ser Ocaml e Common Lisp. Agora, como a maioria dessas linguagens é escrita em C, elas possuem uma interface de função estrangeira natural para C. No entanto, não é tão fácil chamar, por exemplo, uma biblioteca Perl do Python ou vice-versa. Portanto, na prática, as pessoas tendem a
Use uma biblioteca escrita em sua linguagem de implementação, geralmente algo que faça parte das bibliotecas padrão ou esteja amplamente disponível ou
Chame uma biblioteca C / C ++ através dos idiomas FFI. Isso pressupõe que um wrapper ainda não exista, pois, se existir, não será facilmente distinguível de (1).
(2) geralmente é mais difícil, porque você precisa envolver a função C / C ++. Além disso, você deve agrupar a biblioteca ou adicionar uma dependência extra. Por esse motivo, é mais provável que as pessoas usem as bibliotecas de idiomas internas, em vez de usar GSL, por exemplo, que está em C.
Para rotinas muito genéricas, por exemplo, gerar amostras aleatórias a partir de distribuições ou rotinas numéricas básicas como quadratura de integrais, é fácil e comum reutilizar alguma biblioteca. À medida que a funcionalidade que estamos tentando implementar se torna mais complexa, torna-se exponencialmente mais improvável que se encontre a função exata que se deseja em outra biblioteca e, mesmo que se faça, pode-se gastar muito tempo pesquisando e finalmente adaptando a função como necessário (o estilo / design do código pode ser um problema, por exemplo). E, como discutido acima, é possível acessar apenas um subconjunto das bibliotecas existentes. Por outro lado, implementar um algoritmo sozinho, se ele for complexo e não o foco principal, pode ser assustador e, é claro, é preciso lidar com esses problemas de velocidade incômodos.
Portanto, isso se torna um problema de otimização na análise de custo / benefício. Minha experiência é que, mesmo para técnicas comparativamente padrão como o MCMC, eu geralmente acabo escrevendo meu próprio código, porque ele se encaixa melhor na maneira como estou projetando o software geral.
Obviamente, mesmo que você não use o código, é possível aprender com o código de outras pessoas. Mas não sei quantas vezes os cientistas se preocupam em fazer isso. Minha impressão é que ler o código de outras pessoas para aprender é mais uma coisa de engenheiro de software.