Por que o Python é usado para computação científica / de alto desempenho (mas Ruby não)?

106

Há uma citação de uma palestra do PyCon 2011 que diz:

Pelo menos em nossa loja (Argonne National Laboratory), temos três idiomas aceitos para computação científica. Nesta ordem, eles são C / C ++, Fortran em todos os seus dialetos e Python. Você notará a absoluta e total falta de Ruby, Perl, Java.

Foi no contexto mais geral da computação de alto desempenho. A citação concedida é apenas de uma loja, mas outra pergunta sobre idiomas para o HPC também lista o Python como um a aprender (e não o Ruby).

Agora, eu posso entender o C / C ++ e o Fortran sendo usados ​​nesse espaço de problemas (e o Perl / Java não sendo usado). Mas estou surpreso que haja uma grande diferença no uso de Python e Ruby para HPC, uma vez que eles são bastante semelhantes. (Nota - eu sou fã de Python, mas não tenho nada contra Ruby).

Existe alguma razão específica para a decolagem de um idioma? É sobre as bibliotecas disponíveis? Alguns recursos específicos de idioma? A comunidade? Ou talvez apenas contigência histórica , e poderia ter sido o contrário?

Cyclops
fonte
2
Eu sugeriria que, embora ambas sejam linguagens dinâmicas, Python e Ruby sejam bem diferentes. Mais diferente do que semelhante.
precisa
20
Não sei se essa é uma resposta, mas lembre-se de que o Python teve mais 'tração' antes de Ruby decolar fora de uma pequena comunidade com o Rails (por volta de 2005-2006). O Google já usa o Python há algum tempo, o que elevou seu perfil (início dos anos 2000). A sintaxe do Python é clara e fácil de aprender e ler (e lembre-se de que era na época em que Perl era realmente a única outra opção importante), então acho que isso realmente levou a computação científica a isso. Depois disso, foi provavelmente um auto-reforço, pois as pessoas criaram o NumPy / SciPy, o MatPlotLib e muitos outros pacotes de computação científica.
Wkl
4
As pessoas interessadas nesta pergunta também me interessam verificar o site de troca de pilhas da Computational Science .
Mark Booth
2
"legibilidade conta"
jsbueno 25/09
1
Para oferecer alguma perspectiva da Química Computacional, é trivial paralelizar um cálculo com o Python, e barato também. Talvez esses dois também sejam verdadeiros em Ruby. Eu não sei.
Jonathan Landrum

Respostas:

108

Vou expandir meu comentário.

Eu acho que existem alguns fatores que influenciaram o uso do Python na computação científica, embora eu não ache que haja pontos históricos definitivos nos quais você possa dizer: "Sim, essa é a razão pela qual o Python é usado sobre Ruby / qualquer outra coisa "

História antiga

Python e Ruby têm aproximadamente a mesma idade - de acordo com a Wikipedia, o Python foi oficialmente lançado pela primeira vez em 1991 e o Ruby em 1995.

No entanto, o Python ganhou destaque mais cedo do que o Ruby, pois o Google já estava usando o Python e procurando desenvolvedores de Python na virada do milênio. Como não é como se tivéssemos uma história com curadoria de usos de linguagens de programação e suas influências nas pessoas que as usam, teorizarei que essa adoção precoce do Python pelo Google foi um grande motivador para as pessoas que procuram expandir além do uso de Matlab, C ++, Fortran, Stata, Mathematica, etc.

Ou seja, quero dizer que o Google estava usando Python em um sistema onde eles tinham milhares de máquinas (pense em paralelismo e escala) e constantemente processava muitos milhões de pontos de dados (novamente, escala).

Confluência do evento

A computação científica costumava ser feita em máquinas especializadas como SGIs e Crays (lembra-se deles?), E é claro que o FORTRAN era (e ainda é) amplamente utilizado devido à sua relativa simplicidade e porque poderia ser otimizado mais facilmente.

Na última década, mais ou menos, o hardware comum (significando coisas que você ou eu podemos pagar sem ser milionários) assumiu o domínio científico e de computação em massa. Veja os 500 principais rankings atuais - muitos dos 'supercomputadores' melhores do mundo são construídos com hardware Intel / AMD normal.

O Python entrou em um bom momento, pois, novamente, o Google estava promovendo o Python, e o Google estava usando hardware comum, e eles tinham milhares de máquinas.

Além disso, se você pesquisar alguns artigos científicos antigos sobre computação, eles começaram a surgir por volta da era 2000.

Suporte anterior

Aqui está um artigo escrito para o Software e Sistemas de Análise de Dados Astronômicos , escrito em 2000, sugerindo o Python como uma linguagem para a computação científica.

O artigo tem esta citação sobre Python:

Python é uma linguagem de programação interpretada orientada a objetos que começa a receber considerável atenção em aplicações científicas (Python, 1999). Isso ocorre porque o Python e as linguagens de script em geral representam um próximo passo lógico para muitos projetos científicos (Dubois, 1994). Primeiro, o Python fornece uma linguagem de programação interpretada que pode ser vista como uma extensão das linguagens de comando simples já usadas por programas científicos

Segundo, o Python é facilmente integrado ao software escrito em outras línguas. Como resultado, ele pode servir como uma linguagem de controle para a condução de programas existentes, bem como uma linguagem de cola para combinar diferentes sistemas. Finalmente, o Python fornece uma grande coleção de módulos de terceiros, uma base de usuários estabelecida e uma variedade de documentação na forma de livros e referências on-line. Por esse motivo, pode-se vê-lo como uma versão altamente refinada e ampliada do que os cientistas costumam tentar realizar ao escrever seus próprios intérpretes de comando.

Então, você pode ver que o Python já tinha tração desde o final dos anos 90, por ser funcionalmente semelhante aos sistemas existentes na época e porque era fácil integrar o Python a coisas como C e aos programas existentes. Com base no conteúdo do artigo, o Python já estava em uso científico desde o período de 1995-1996.

Diferença no crescimento da popularidade

A popularidade de Ruby explodiu junto com o surgimento do Ruby On Rails, que foi lançado em 2004. Eu estava na faculdade quando ouvi pela primeira vez o burburinho sobre Ruby, e isso foi por volta de 2005-2006. O django para Python foi lançado no mesmo período (julho de 2005, de acordo com a Wiki), mas o foco da comunidade Ruby parecia muito centrado na promoção de seu uso em aplicativos da web.

O Python, por outro lado, já tinha bibliotecas que se encaixam na computação científica:

  • NumPy - NumPy começou oficialmente em 2005, mas as duas bibliotecas em que foi construída foram lançadas anteriormente: Numeric (1995) e Numarray (2001?)

  • BioPython - biblioteca de computação biológica para python, remonta a 2001, pelo menos

  • SAGE - Pacote de matemática com o primeiro lançamento público no início de 2005

E muito mais, embora eu não conheça muitas de suas linhas de tempo (além de apenas navegar nos sites de download), mas o Python também tem o SciPy (construído no NumPy, lançado em 2006), tinha ligações com R (a linguagem de estatísticas) em no início dos anos 2000, adquiriu o MatPlotLib e também obteve um ambiente de shell realmente poderoso no ipython.

O ipython foi lançado pela primeira vez no início dos anos 2000 e teve muitos recursos adicionados que o tornam muito bom para a computação científica, como gráficos integrados do matplotlib e capacidade de gerenciar clusters computacionais .

Do artigo acima:

Também vale a pena notar vários outros projetos de computação científica relacionados ao Python. A extensão numérica do Python adiciona manipulação rápida de matriz e matriz ao Python (Dubois 1996), o MMTK é um kit de ferramentas baseado em Python para modelagem molecular (Hinsen 1999), o projeto Biopython está desenvolvendo ferramentas baseadas em Python para pesquisa em ciências da vida (Biopython 1999), e o Visualization Toolkit (VTK) é um pacote de visualização avançado com ligações Python (VTK, 1999). Além disso, projetos em andamento na comunidade Python estão desenvolvendo extensões para processamento e plotagem de imagens. Finalmente, o trabalho apresentado em (Greenfield, 2000) descreve o uso de Python em projetos no STScI.

Boa lista de pacotes científicos e numéricos para Python .


Muito disso provavelmente se deve ao início da história e à relativa obscuridade do Ruby até os anos 2000, enquanto o Python ganhou força graças ao evangelismo do Google.

Então, se você estava avaliando as linguagens de script no período de 1995 a 2000, o que realmente estava vendo? Havia o Perl, que provavelmente era diferente o suficiente sintaticamente, para que as pessoas não quisessem usá-lo, e o Python, que tinha uma sintaxe mais clara e melhor legibilidade.

E sim, provavelmente há muito auto-reforço - o Python já possui todas essas ótimas bibliotecas úteis para a computação científica, enquanto o Ruby tem uma voz minoritária defendendo seu uso na ciência, e há algumas bibliotecas surgindo , como o SciRuby , mas As ferramentas do Python amadureceram na última década.

A comunidade de Ruby em geral parece estar muito mais interessada em promover o Ruby como uma linguagem da web, pois foi isso que realmente o tornou conhecido, enquanto o Python começou em um caminho diferente e, posteriormente, tornou-se amplamente usado como uma linguagem da web.

wkl
fonte
8
Eu tinha esquecido um pouco sobre a integração c. Em muitos casos, um cálculo científico é computacionalmente intensivo, e ser capaz de escrever uma rotina CA apenas para esse bit é uma vantagem importante.
Spencer Rathbun
1
@SpencerRathbun O artigo que vinculei menciona o uso do Python com SWIG para gerar wrappers e permitir que o Python interaja com o código C / C ++. O SWIG não recebeu suporte oficial do Ruby até o Ruby 1.6, que foi lançado em 2004. Portanto, o Python já tinha um grande avanço em mente, compartilhando e utilizando ferramentas adequadas para permitir que as pessoas instalassem o Python em seus sistemas existentes. Não ter que abandonar todo o código FORTRAN / C existente e otimizado que estava em uso foi provavelmente o maior driver.
Wkl
3
Em 1991, estávamos usando o TCL para conectar bibliotecas numéricas como uma maneira de analisar dados sem precisar escrever massas de C / Fortran. O Python surgiu no momento certo para substituir o TCL. A facilidade de interface com o 'C' (e pelo F2C com o fortran) foi o grande problema em comparação com o PERL, a interface TCL com o 'C' foi muito fácil
Martin Beckett
Processos de anexo preferencial explica muito sobre quais idiomas são usados. É Zipfian! Veja O Zipf Myatery "PAP" é explicado às 12:50.
Radarbob 20/07/16
37

Eu usei o Python extensivamente para aplicativos de engenharia e o Ruby para aplicativos da web.

O problema que vejo no Ruby como uma linguagem científica é que existem muitas opções de sintaxe para uma determinada operação.

O Python foi projetado com a seguinte premissa "Deve haver uma - e de preferência apenas uma - maneira óbvia de fazer isso". Isso torna MUITO mais fácil ler o código de alguém e determinar sua intenção. Isso é essencial para as análises por pares de engenharia, etc.

Eu gosto de Ruby e é ótimo para determinadas tarefas, mas meu código Ruby pode ser sintaticamente totalmente diferente de um código de programador diferente que faz exatamente a mesma coisa. Isso causa muita ambiguidade em um ambiente científico ou de engenheiro.

Joshua Shreve
fonte
3
Sim, de fato. Ruby está na tradição TIMTOWTDI e, portanto, é apenas um Perl ligeiramente melhor. O software é escrito para programadores. Compiladores / intérpretes são, nesse sentido, um público secundário. Os cientistas tendem a ser sérios ao realizar seu trabalho sem muita interferência de softwares desnecessariamente difíceis. QED
Dominic Cronin
4
Não tenho certeza se eu sigo esse argumento. Se o programador, e não uma máquina, é o público principal, há momentos em que a redação das coisas melhora a clareza e destaca a intenção. Uma linguagem mais flexível não ajuda a entender nossos cérebros humanos macios?
quer
10
Mas C também pode parecer uma explosão na fábrica ASCII. Lembre-se de que em C, uma matriz é uma capa em torno de ponteiros. Portanto, a matriz [5] pode ser escrita como * (matriz + 5), que pode ser escrita como * (5 + matriz), que pode ser escrita como 5 [matriz]. O que é estúpido.
Jonathan Landrum
1
Sou um programador perl de muito longo prazo e continua sendo meu idioma favorito para a maioria dos propósitos. Não tenho certeza sobre matemática embora. Eu discordo dessa atitude em relação à abordagem TIMTOWTDI. Ter muitas abordagens disponíveis não significa que elas são boas, é claro, mas é importante poder personalizar sua expressão para que ela seja mapeada de maneira clara e direta à idéia que você está expressando, tanto para o público humano quanto para o de máquinas. A falta de opções sintáticas não ajuda nisso.
Mc0e
@ AndrewVit: Não necessariamente. O TIMTOWTDI funciona muito bem se você tiver um desenvolvedor ou se tiver uma equipe pequena e bem integrada de desenvolvedores. Mas assim que você tiver pessoas que nunca se conheceram trabalhando no mesmo código, você começará a se perguntar "Ah, por que elas fariam dessa maneira?" Ou, como alternativa, você escreverá um guia de estilo para forçar todo mundo a fazê-lo da mesma maneira e não estará mais usando o TIMTOWTDI.
Kevin
17

Em suposição, grande parte disso seria a dependência do matlab por muitos pesquisadores. Python tem alternativas, como sábio . Enquanto o rubi não, ou pelo menos não há óbvios.

Em segundo lugar, de acordo com a FAQ do Ruby , o python é orientado a procedimentos e a objetos, enquanto o ruby ​​se disfarça como uma linguagem processual. Se você estiver escrevendo um pequeno script para fins de matemática, como o que você faria no matlab, o paradigma OO é uma dor de cabeça. Não apenas isso, mas força um salto conceitual para longe dos paradigmas funcionais / processuais que os pesquisadores usam. A matemática não é OO. A matemática é funcional, seguida de processual (pense em provas da lógica).

Por fim, observe que as Perguntas frequentes do Ruby afirmam que o ruby ​​é mais complexo que o python. A programação vem em segundo para os pesquisadores, não como nós.

Spencer Rathbun
fonte
22
Eu acho que a coisa OO é um pouco de um arenque vermelho. O que um pesquisador se importa se a expressão 1 + 1envia a mensagem +ao objeto 1? Isso não altera a estrutura do seu programa nem um pouco.
precisa saber é o seguinte
1
@ sepp2k, acho que Spencer está sugerindo que Ruby exigiria que os cientistas programassem de maneira diferente. Não conheço Ruby, mas supondo que você tenha que criar objetos para escrever um programa em Ruby, enquanto o Python permite procedimentos - isso aumentaria a sobrecarga mental. Concedido não muito, mas para um não programador, todo trabalho extra seria um motivo para usar outro idioma.
Ciclope
7
@ Cyclops eu recebo o que ele está sugerindo. Estou dizendo que está errado. O ponto principal da citação sobre o ruby ​​mascarado como uma linguagem processual é que você não precisa estruturar seu programa de maneira orientada a objetos. Se você digitar algo como "2 + 2", estará criando dois objetos Inteiros e chamando um método em um (passando o outro como argumento). No entanto, isso não torna mais difícil digitar "2 + 2" em rubi do que digitar "2 + 2" em outros idiomas.
sepp2k
5
Estou com o sepp2k, também não compro esse argumento. Algumas linguagens, como Java, impõem o paradigma OO a você - não com Ruby. O que o impede de escrever um programa puramente processual ou funcional em Ruby?
9788 Mike Baranczak # 03
2
@ Cyclops exatamente. Embora Ruby possa fingir ser processual, em um contexto não trivial, você encontrará situações em que o paradigma OO faz a linguagem funcionar de uma certa maneira. Se você não entende ou ignora isso, ou é incapaz de fazer o que deseja ou acaba com um truque bagunçado.
Spencer Rathbun
14

Quando o BDFL (Guido van Rossum) escreveu o Python pela primeira vez, o objetivo era que fosse tão compreensível quanto o inglês comum (proposta de financiamento da DARPA), o que eliminaria erros comuns de codificação.

Um problema que é altamente visível é o uso de recuo para delimitar blocos. Em idiomas que possuem delimitadores de declaração complexos e explícitos (por exemplo, chaves C, Pascal BEGIN / END), o espaço em branco seria recolhido para um único caractere de espaço antes de alimentar o código ao lexer. Isso permitiria uma grande variação na forma como o código é organizado.

Para programadores profissionais, isso não é um problema, porque eles se treinaram para lidar com isso a partir de 30 ou mais horas por semana de prática.

Para outros profissionais em que a programação é uma ferramenta, esse problema se torna um grande problema. Este grupo inclui matemáticos, físicos, químicos, engenheiros, etc.

Como o Python reduz erros para programadores não profissionais, permite que eles pensem no problema que estão tentando resolver e não precisam lidar tanto com a mecânica da linguagem.

Este é um exemplo único de por que é popular fora da profissão de programador. Existem outros exemplos que podem ser usados ​​para ilustrar o mesmo ponto, como as baterias incluídas, The Zen of Python ( import this), o uso do humor de Monty Python e assim por diante.

Lance Helsten
fonte
Não consigo encontrar nenhuma referência a uma dissertação ou programa de doutorado no currículo ou na lista de publicações de Guido . Você tem uma citação para isso? Esta entrevista apenas diz que ele era um pesquisador do CWI.
M. Dudley
Eu errei totalmente: li que ele fez uma dissertação, mas não fiz a pesquisa adequada. Encontrei meu erro depois de escrever este post, mas nunca fiz a correção aqui. Obrigado.
Lance Helsten
5

Esta é uma ótima discussão aqui, acho que as postagens aqui realmente responderam por que o python é mais popular na comunidade científica. No entanto, existem alguns argumentos contrários para as ciências ruby:

  • O ruby ​​pode ser codificado de maneira mais intuitiva que o python (DSL etc): considerando os pacotes corretos usados:

    verifique bioruby: http://bioruby.org/ uma reserva de sequência pode ser simplesmente: s.reverse etc.

  • ruby permite um nível mais alto de abstrações ao mesmo tempo em que é conciso.

  • melhor sistema de gerenciamento de pacotes: gemas ruby ​​são muito mais fáceis em comparação com: setuptools, pip etc

No entanto, a adoção do ruby ​​foi / é / será prejudicada por sua complexidade. Estou pensando que o Lisp é uma linguagem ótima / poderosa, mas por que não decolou como uma linguagem geral? a situação semelhante está aqui com o ruby ​​- ele herda muito poder do lisp, da conversa fiada e do perl !: mas apenas uma seleção de pessoas realmente o usará para obter os benefícios. No final, ele pode permanecer forte em determinadas áreas de nicho / especiais (como o trilho na rede, a configuração de marionetes), é difícil para os 'não' programadores aproveitarem totalmente, mas pode ser o bom amigo do programador (vi um computador os cientistas gostam da linguagem: http://www.cleveralgorithms.com/nature-inspired/index.html )

Algumas atualizações mais recentes: parece que o python já está assumindo a paisagem. Recentemente, livros como: http://www.amazon.com/Python-Data-Analysis-Wes-McKinney/dp/1449319793 e muitos outros livros (análise de dados, aprendizado de máquina etc.) são todos escritos com python como a linguagem usada . Se o ruby ​​quiser recuperar o atraso, precisará de alguns esforços sérios. Considerando o matplotlib em python, provavelmente leva vários anos para chegar ao estado em que está agora. A menos que alguns esforços sérios sejam colocados em ruby, ele provavelmente não poderá acompanhar o estágio da análise de dados em python / computação científica nos próximos 2-3 anos.

Isaac Pei
fonte
3

Depois de usar o python para análise de dados por um tempo (proveniente de experiências trabalhando com ruby, lua e R), o pacote numpy (e muitas bibliotecas científicas relacionadas) torna 'possível' executar uma computação rápida (velocidade semelhante a C, como numpy é escrito / integrado com códigos C) com a facilidade de programação em python.

O Numpy existe há algum tempo, a disponibilidade dele ajudou muitos outros pacotes científicos relacionados a serem construídos, como scipy, pandas ... etc. A biblioteca de cálculo está sendo desenvolvida (NMtrix: https://github.com/SciRuby/nmatrix ). Essa enorme diferença de tempo faz do python a escolha óbvia para a computação científica.

Ipstone
fonte
5
"no final, python é como a linguagem de todos", você precisará fornecer uma fonte para fazer o backup.
1055 Walter Walter
2

Eu estive pensando a mesma coisa. Eu acho que é, como Spencer Rathbun disse, por causa do aspecto processual do Python. Sendo eu mesmo "não programador", acho lindo o modo como você pode codificar no Ruby e o framework Rails é excelente para facilitar o uso. No entanto, ao codificar para fins científicos (matemática, biologia, etc.), você normalmente pensa em uma linguagem "matemática", ou seja, não se importa com declarações como

Person.find_by_name 'Juanito'

mas você se preocupa mais

A = B*C + D

Então, eu acho que Ruby é poderoso, pois muitos de seus recursos não seriam utilizados em um programa científico. É mais fácil pensar em procedimentos.

juandiego
fonte
0

O Python tem melhor suporte para matrizes N-dimensionais com o pacote Numpy. Não vi nada parecido com Ruby.

O Python parece ser mais rápido na computação numérica / computação científica que eu fiz. Não tenho outra prova senão quando escrevi algoritmos semelhantes em Python e Ruby, os algoritmos do Python foram mais rápidos (YMMV).

Josh Petitt
fonte
2
Isso realmente não contribui muito para a discussão. A eficácia do Numpy já está coberta (em mais detalhes) na resposta aceita . Seu argumento de desempenho permanece pouco convincente; Não gosto de contar com anedotas ao discutir o desempenho histórico, especialmente quando tais argumentos provavelmente já estão bem cobertos por referências confiáveis ​​(bem, mais confiáveis ​​do que uma anedota sem contexto).
13-13:
@ Brian, concordou.
Josh Petitt
@Brian, minha contribuição específica foi o comentário sobre matrizes N-dimensionais. Este é o núcleo do que o Numpy é construído, sim, mas eu não vi nenhuma menção a matrizes ND. Este é o núcleo da álgebra linear e o que Matlab e Numpy fazem bem. Ruby usa matrizes como programadores usam matrizes, não como engenheiros e cientistas usam matrizes (ou seja, matriz). Se você acha que isso ajudaria, adicionarei um comentário sobre matrizes ND à resposta aceita.
Josh Petitt
@Brian, e ainda mantenho meu comentário de que não vi um bom suporte de matriz ND para Ruby para computação científica.
Josh Petitt
0

Uma razão é que o Python tem um bom suporte para usar / integrar / chamar código C / C ++, enquanto que eu saiba que Ruby não oferece o mesmo grau de (facilidade de) integração. Isso significa que você pode escrever os componentes de código de alto desempenho em C / C ++ e usar o Python (isto é, uma linguagem de alto nível / mais fácil para os olhos) para colar tudo. Imagino que esse também seja um dos motivos de sua adoção institucional antecipada pelo Google.

david.barkhuizen
fonte
0

Acho que uma das principais razões pelas quais o Python se tornou tão popular para a ciência de dados foi por causa da quantidade de tempo / esforço (ou seja, dinheiro) que economizamos para estender nossos scripts para uma solução real (por exemplo, sistema de software). Com o Python, poderíamos criar mais facilmente uma solução de sistema com base no código que escrevemos para a ciência de dados.

Tenho experiências com a procura de um idioma para intérpretes com esse recurso há cerca de 15 anos. Na época, o Python foi escolhido para ser o único, não porque é a linguagem perfeita para a ciência de dados, mas porque era uma linguagem OOP rara com intérprete rápido / portátil que também era extensível para interagir com outras linguagens como C / C ++ / Java. Diferentemente dos dias de hoje, esses eram ótimos, mas raros, recursos para criar soluções diretamente a partir do código base já implementado para a ciência de dados.

O tempo pode ser outro fator crítico para criar uma linguagem de ciência de dados. Há 15 anos, descobrimos que já havia pacotes básicos, como numérico e scipy, para computação numérica em Python, mas nem conhecíamos a existência do Ruby como uma linguagem de programação. No final de 2018, eu pude encontrar vários projetos usando Ruby para ciência de dados. Talvez 10 anos depois, alguém possa perguntar por que Ruby é tão popular para a IA.

Tae-Sung Shin
fonte