Python vs FORTRAN

17

Qual é o melhor: FORTRAN ou Python? E acho que nos dois casos você precisa do Gnuplot, estou certo?

Estou trabalhando em uma máquina Windows no momento.

Gostaria de usá-lo para obter soluções numéricas para problemas físicos, incluindo simulações de Monte-Carlo, integração e diferenciação numéricas, dinâmica molecular, etc.

Eu vi um curso de física computacional que introduz o FORTRAN (77 eu acredito) e o Python. Estou planejando começar com um e depois aprender o outro, mas não sei qual transição pode ser a mais fácil.

Também quais compiladores você recomendaria?

A questão básica para mim se resume a: qual é o mais fácil de aprender, qual é o mais rápido, qual é o mais fácil de usar e, acima de tudo, qual é o mais usado (para uma comparação desses 4)? Além disso, quais são os compiladores mais comuns (gratuitos ou pagos) em uso? Atualmente, estou pensando em converter um laptop antigo (antigo Intel dual core) em Linux; espero que seja rápido o suficiente.

Muito obrigado pelas respostas até agora! As respostas que estão alinhadas com o que estou procurando são as de LKlevin e SAAD.

Eu sei o básico de C ++, Maple e domino o MATLAB e o Mathematica9 quase completamente, se isso for de alguma ajuda.

usuario
fonte
12
Você realmente precisa ser mais específico; é como perguntar "o que é melhor: um martelo ou uma chave de fenda?". Dê uma olhada em scicomp.stackexchange.com/questions/11006 (trata-se de C ++ em vez de Fortran, mas a maioria dos pontos deve ser aplicada igualmente).
Christian Clason
@ChristianClason, fair point: p #
Nick #
Obrigado pela sua edição, embora isso realmente não restrinja as coisas. Não sei ao certo o que mais pode ser dito do que já é dado como resposta à pergunta acima.
Christian Clason
2
Além disso, a pergunta sobre compiladores é uma questão separada e deve ser uma questão separada. (Caso contrário, as pessoas familiarizadas com o Fortran, mas não interessadas no Python, não o verão.) Algumas recomendações já são fornecidas em scicomp.stackexchange.com/questions/8617 .
Christian Clason
11
Se você conhece o matlab, pode aprender a maioria dos algoritmos numéricos implementando-os, embora seu desempenho quase sempre seja pior do que as rotinas do matlab integradas. A partir daí, você pode decidir quais são suas necessidades de desempenho e mudar para uma biblioteca / linguagem mais eficiente.
Godric Seer

Respostas:

29

Facilidade de aprendizado

Python e Fortran são linguagens relativamente fáceis de aprender. Provavelmente é mais fácil encontrar bons materiais de aprendizado em Python do que bons materiais de aprendizado em Fortran, porque o Python é usado mais amplamente, e o Fortran atualmente é considerado uma linguagem "especializada" para computação numérica.

Acredito que a transição do Python para o Fortran seria mais fácil. Python é uma linguagem interpretada, portanto, o número de etapas necessárias para executar o primeiro programa é menor (abra o interpretador, digite print("Hello, world!")no prompt) do que para o Fortran (escreva um programa "Hello world", compile, execute). Também acho que existem materiais melhores para ensinar estilo orientado a objetos no Python do que no Fortran, e há mais código Python disponível no GitHub do que o código Fortran.

Instalando e executando no Windows

Instalar o Python deve ser menos doloroso; existem distribuições do Windows disponíveis. Eu recomendo usar uma distribuição científica como Anaconda ou Enthought Canopy. Não existe realmente um compilador, por si só; o intérprete assume esse papel. Você deseja usar um intérprete baseado em CPython, porque há mais bibliotecas numéricas disponíveis e ele interopera bem com C, C ++ e Fortran. Outras implementações de intérpretes incluem Jython e PyPy.

Em uma máquina Windows, a instalação de um compilador Fortran será irritante. Compiladores de linha de comando típicos são programas como gfortran, ifort (da Intel; gratuito para uso pessoal, caso contrário custa dinheiro) e pgfortran (da PGI; versões de avaliação gratuita, caso contrário, custa dinheiro). Para instalar esses compiladores, pode ser necessário instalar algum tipo de camada de compatibilidade do tipo UNIX / POSIX, como Cygwin ou MinGW. Achei difícil trabalhar com isso, mas algumas pessoas gostam desse fluxo de trabalho. Você também pode instalar um compilador com uma GUI, como o Visual Fortran (novamente, você teria que pagar por uma licença).

No Linux, será mais fácil instalar o Python e os compiladores; Eu ainda instalaria o Anaconda ou o Enthought Canopy como uma distribuição Python.

Velocidade: uma troca entre produtividade e desempenho

Ao usar Python (ou MATLAB, Mathematica, Maple ou qualquer linguagem interpretada), você desiste do desempenho pela produtividade. Comparado ao Fortran (ou C ++, C ou qualquer outra linguagem compilada), você escreverá menos linhas de código para realizar a mesma tarefa, o que geralmente significa que levará menos tempo para obter uma solução funcional.

A penalidade de desempenho efetiva pelo uso do Python varia e é atenuada pela delegação de tarefas computacionalmente intensivas em linguagens compiladas. O MATLAB faz algo semelhante. Quando você faz uma multiplicação de matrizes no MATLAB, ele chama BLAS; a penalidade de desempenho é praticamente zero e você não precisa escrever nenhum Fortran, C ou C ++ para obter o alto desempenho. Uma situação semelhante existe no Python. Se você pode usar bibliotecas (por exemplo, NumPy, SciPy, petsc4py, dolfin do FEniCS, PyClaw), você pode escrever todo o seu código em Python e obter um bom desempenho (uma penalidade de talvez 10-40%), porque tudo computacionalmente partes intensivas são chamadas para bibliotecas de idiomas compiladas rapidamente. No entanto, se você escrever tudo em Python puro, a penalidade de desempenho seria um fator de 100-1000x. Portanto, se você quisesse usar o Python e tivesse que incluir um personalizado, Na rotina de computação intensiva, seria melhor escrever essa parte em uma linguagem compilada como C, C ++ ou Fortran e, em seguida, agrupá-la com uma interface Python. Existem bibliotecas que facilitam esse processo (como Cython e f2py) e tutoriais para ajudá-lo; geralmente não é oneroso.

Âmbito de uso

O Python é usado mais amplamente como uma linguagem de uso geral. O Fortran é amplamente limitado à computação numérica e científica e está competindo principalmente com C e C ++ pelos usuários desse domínio.

Na ciência da computação, o Python normalmente não compete diretamente com linguagens compiladas devido às penalidades de desempenho que mencionei. Você usaria o Python para casos em que deseja alta produtividade e desempenho. É uma consideração secundária, como na prototipagem de algoritmos numericamente intensivos, processamento de dados e visualização. Você usaria o Fortran (ou outra linguagem compilada) quando tiver uma boa idéia de qual deve ser o design do seu algoritmo e aplicativo; você está disposto a gastar mais tempo escrevendo e depurando seu código, e o desempenho é fundamental. (Por exemplo, o desempenho é uma etapa limitante do seu processo de simulação ou é uma entrega essencial em sua pesquisa.) Uma estratégia comum é misturar o Python e uma linguagem compilada (geralmente C ou C ++, mas o Fortran também foi usado), e use apenas a linguagem compilada para as partes mais sensíveis ao desempenho do código; o custo de desenvolvimento é, obviamente, mais difícil de escrever e depurar um programa em dois idiomas do que um programa em um único idioma.

Em termos de paralelismo, o atual padrão MPI (MPI-3) possui ligações Fortran e C nativas. O padrão MPI-2 tinha ligações C ++ nativas, mas o MPI-3 não, e você teria que usar as ligações C. Existem ligações MPI de terceiros, como mpi4py. Eu usei o mpi4py; funciona bem e é fácil de usar. Para o paralelismo em larga escala (dezenas de milhares de núcleos), você provavelmente desejaria usar uma linguagem compilada, porque coisas como carregar dinamicamente os módulos Python o morderão em grande escala se você fizer isso de uma maneira ingênua. Existem maneiras de contornar esse gargalo, como demonstrado pelos desenvolvedores do PyClaw, mas é mais simples evitá-lo.

Opiniões pessoais

Tenho cerca de uma década de experiência no Fortran 90/95 e também programado no Fortran 2003. Tenho cerca de cinco anos de experiência em programação em Python. Eu uso o Python muito mais do que o Fortran porque, francamente, eu faço mais no Python. A maior parte do trabalho que eu preciso fazer não requer grandes recursos de supercomputação e geralmente não vale a pena ser re-desenvolvida em outra linguagem; portanto, o Python é adequado para resolver ODEs e PDEs. Se eu precisar usar uma linguagem compilada, usarei C, C ++ ou Fortran, nessa ordem.

A maior parte do código Fortran que eu vi foi feia, principalmente porque a maioria da comunidade de ciência da computação parece desconhecer ou aversa a quaisquer práticas recomendadas descobertas por engenheiros de software nos últimos 30 anos. A saber: não há uma boa estrutura de teste de unidade no Fortran. (O melhor que me deparei é o FUnit, da NASA, e isso não é mais mantido.) Existem algumas boas estruturas de teste de unidade Python, bons geradores de documentação Python e geralmente muitos exemplos melhores de boas práticas de programação.

Geoff Oxberry
fonte
Resposta muito agradável e completa :). Instalei o Linux ontem, onde o compilador python já estava presente. Agora eu queria saber se existe uma maneira fácil de compartilhar arquivos entre minha máquina Linux e Windows? Percebi que sempre que uso um stick para transferir dados, a máquina Windows e Linux ignora certas partes no de stich (que é formatado no formato NFTS).
Nick
e meu último problema foi resolvido usando o formato FAT32 (pelo menos até agora).
Nick
Nota: O FAT32 possui um tamanho máximo de arquivo limitado.
meawoppl
@Meawoppl, existe uma maneira mais conveniente de trocar arquivos entre Linux e Windows? Talvez dropbox então? Existe também uma solução baseada em hardware?
Nick
Mantenha seus arquivos com menos de 4 GB: P Realmente, não conheço uma boa solução. Há também alguma derrogação nas convenções de nome de arquivo. Lembro-me de quebrar o suporte a algumas janelas uma vez, nomeando um arquivo <3.txt que deixou M $ bastante triste. O suporte a NTFS no linux é muito bom agora, mas é notavelmente um total impedimento no OSX. Eu realmente pensei que já teríamos resolvido esse problema.
meawoppl
7

Eu ficaria longe de Fortan ou, se precisar, usaria uma versão razoavelmente nova (2003 em vez de 77). Muitos softwares de física (simulações de Monte Carlo em particular) são escritos no Fortran, simplesmente porque os projetos foram originalmente iniciados nos anos 80.

Dito isto, python e Fortran são duas linguagens muito diferentes, e para o que elas devem ser usadas é bem diferente. O Python é de alto nível e, em geral, não é tão rápido (em comparação com o Fortran e C ++). O motivo pelo qual está sendo usado tanto é que é rápido o suficiente para a maioria das coisas e possui excelentes bibliotecas (alimentadas pelo Fortran) para muitas (mas não todas) as coisas que você gostaria de fazer. Ele também possui o excelente Matplotlib para plotagem (portanto, não há necessidade do GNUplot) e você pode obter um desempenho bastante decente usando coisas como Cython para escrever os bits caros. No entanto, não será tão rápido quanto o Fortran ou C ++, e a paralelização é bastante terrível, tornando-o inadequado para computação numérica de alto desempenho. Se o que você deseja pode ser tratado chamando as bibliotecas Fortran ou C, no entanto,

Fortran é uma linguagem de nível um pouco inferior. Para numéricos, o suporte à biblioteca é surpreendentemente bom, mas ainda é um nível muito baixo, oferecendo uma série de bugs que você poderia evitar, como passar acidentalmente o tamanho errado da matriz para um método. Esses erros são difíceis de encontrar e você pode nem perceber. Confie em mim, passei um bom tempo escrevendo Fortran 77.

C ++ é (na minha humilde opinião) um meio feliz. Com bibliotecas como Armadillo ou Eigen, você pode obter um estilo de codificação de nível bastante alto e obter um estilo de desempenho de baixo nível.

Falando em desempenho, a única opção real para python numérico no momento é o CPython. Se você baixar algo como o WinPython , também obterá a maioria das bibliotecas necessárias.

Para Fortran no Windows, as coisas são um pouco mais difíceis. Eu recomendaria mudar para o linux e usar o compilador gfortran ou Intels ifort. Ifort tende a ser mais rápido para código numérico na minha experiência, mas é gratuito apenas para uso não comercial e não acadêmico.

Resumindo: a menos que você queira executar simulações realmente pesadas, o python é de longe a escolha mais fácil e muito mais agradável de se trabalhar. Também deve ser rápido o suficiente para a maioria dos projetos no nível do aluno. Se você precisar de melhor desempenho, comece analisando as quantidades desperdiçadas de bibliotecas já escritas e deixe que isso decida seu idioma. Se você precisar escrever coisas do zero, use C ++.

Também é um aviso: a maioria dos códigos escritos por físicos é bastante terrível, presumivelmente porque os físicos tendem a assumir que a programação é fácil e não requer o mesmo rigor que eles podem usar em matemática. Considere fazer uma aula ou comprar um livro que ensina programação.

Disclaimer: Eu sou um físico que passou bastante tempo com os códigos de Monte Carlo baseados em Fortran 77 e atualmente faz todo o processamento de dados em Python.

LKlevin
fonte
Em relação à paralelização, os pesquisadores usaram o Python em paralelo com sucesso em dezenas de milhares de núcleos com boa eficiência paralela. (Por exemplo, o PyClaw foi executado em todos os Shaheen, com mais de 65.000 núcleos.)
Geoff Oxberry
11
Bem, é possível, mas que eu saiba apenas certificando-se de que a parte paralela ocorra fora do CPython, o que é um esforço considerável. A parte paralela do PyClaw (PETSc) é escrita em C, por exemplo. Outra alternativa é executar várias instâncias do CPython, mas não é exatamente trivial.
LKlevin
A maioria dos aplicativos paralelos não é trivial. Você escreveu "A paralelização [Python] é bastante terrível, tornando-a inadequada para computação numérica de alto desempenho". Ninguém escreve nenhum código de alto desempenho em Python puro. O raciocínio para esta decisão não tem nada a ver com paralelismo e não invalida o uso do Python como uma linguagem de interface na computação de alto desempenho, desde que seja utilizado adequadamente. Sua citação é um homem de palha que confunde as questões de paralelismo, alto desempenho e linguagens interpretadas; ninguém competente projetaria um aplicativo como esse.
Geoff Oxberry
Concordo que o Python é uma excelente linguagem de interface para quase qualquer finalidade, mas isso está se afastando da questão. A maioria das aplicações não é trivial, o problema aqui é que todos os casos de paralelização, incluindo os triviais, não são triviais em python. Isso pode ser um incômodo se o seu problema for bem descrito em termos de operações Numpy ou Cython. Não, você não usaria isso em um cluster de 65000 núcleos, mas poderá aceitar o desempenho 2x em um núcleo de 100.
LKlevin #
Paralelamente, o mais interessante do Fortran é que, além do MPI / OpenMP, também existem co-matrizes que agora fazem parte do padrão. Por exemplo, veja isto jolts.stanford.edu/72/…
stali
7

Python é uma linguagem muito lenta e de alto nível. Para processamento rápido de números, você precisará escrever os principais kernels de computação em linguagens de baixo nível, como C / C ++, o que significa que agora você precisa aprender não um, mas pelo menos dois idiomas. Você também terá que lidar com dores de cabeça adicionais associadas à depuração / instalação / manutenção, etc. A maioria das pessoas usa o Python como um açúcar sintático para ocultar deficiências do C / C ++.

O Fortran moderno (90 e posterior) é de nível rápido e alto, com quase a sintaxe do MATLAB. Então você pode fazer coisas como:

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

ou

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

ou ainda mais simples

indx=indxmap(indx,2)

etc.

No Linux, existem vários compiladores Fortran gratuitos. eu uso

  1. GCC
  2. Solaris Studio
  3. Open64
  4. Intel (somente uso não comercial)

Eu não uso Macs / OSX, mas há IGP grátis.

E por favor não use o FORTRAN 77. Ninguém o usa para escrever um novo código.

Exoneração de responsabilidade: Eu olhei pessoalmente para o Python para escrever meu próprio pequeno código FE não estruturado (parte superior do PETSc), mas a quantidade de trabalho / codificação envolvida foi mais do que simplesmente escrever o Fortran 95.

stali
fonte
11
Para isso, eu acrescentaria que você pode fazer uma programação orientada a objetos bastante séria no Fortran 2003; veja por exemplo este guia . Eu tenho usado muito isso no meu próprio código e tem sido muito eficaz para o que eu quero fazer. Muitas pessoas dirão para você evitá-lo - eu digo, mantenha a mente aberta, você pode gostar muito. Eu certamente faço.
Daniel Shapero
4

O Python é muito prático para análise de simulação completa com pacotes versáteis e bem documentados: geração de grade, computação em array e manipulação da estrutura de dados ( numpy e pandas ), bem como visualização de dados com o matplotlib. Para simulações complexas com grandes arquivos de resultados, é ainda melhor trabalhar com o pacote VTK, que permite que a exportação de dados seja lida por aplicativos avançados de código aberto (como Paraview ou Visit)

O Fortran é há algum tempo o idioma preferido para diferentes domínios nas simulações. É facilmente legível (embora menos legível que o código Python). A manipulação de matrizes é um dos pontos fortes da linguagem, bastante fácil de definir e usar em todos os tipos de operações de matriz. Também é útil ao depurar.

A comparação se resume ao desempenho : só fiz cálculos em grande escala usando linguagens compiladas (C ++ e Fortran 90), mas nunca com Python. Outro tópico fornece mais informações de desempenho sobre linguagens interpretadas e compiladas: Qual idioma devo usar ao ensinar um curso de graduação em programação de computadores?

Pessoalmente, gosto de trabalhar com o Python em geral, especialmente para pós-processamento. A programação em Python é divertida!

SAAD
fonte
11
O desempenho é quase sempre importante. A falta de atenção ao desempenho é o motivo pelo qual as pessoas precisam de 8 núcleos com 16 GB de RAM para verificar e-mails e navegar na web.
stali
Eu tive a infelicidade de ter que ler o código python de outras pessoas. Eu não classificaria o código py como fácil de ler.
Biswajit Banerjee
@stali: Eu concordo totalmente
SAAD
11
@BiswajitBanerjee: não é impossível escrever código complicado com qualquer idioma, mas pelo menos eu posso facilmente identificar entradas e saídas de qualquer função, é aqui que o Fortran se torna horrível! :)
SAAD
3

Com o Python, você não precisa do Gnuplot, pode usar, por exemplo, matplotlib e / ou usar o shell IPython. O IPython é um shell Python interativo que, no modo% pylab, fornece praticamente os mesmos comandos de plotagem disponíveis no MATLAB.

É bem provável que a computação científica mude muito do MATLAB para o Python nos próximos 5 anos ou mais.

jolvi
fonte
Uma vantagem do Gnuplot é que ele quase sempre é instalado em máquinas Linux (cluster / servidores etc.) e muito útil para visualização rápida / suja. É como vi para viz.
stali
1

Eu continuaria usando o MATLAB, ele chama bibliotecas matemáticas rápidas e você não verá muita diferença no desempenho ao mudar para o FORTRAN no Windows. Ao mesmo tempo, você terá uma infraestrutura melhor no MATLAB para relatar resultados e executar seu código. A desvantagem do MATLAB é o seu custo. O FORTRAN é basicamente gratuito, e há várias bibliotecas gratuitas por aí.

O FORTRAN é muito fácil de aprender e iniciar a programação. Basicamente, faz o que o nome sugere: converte suas fórmulas em código, o que é fácil de ler e entender. É por isso que os físicos costumavam usá-lo muito nos velhos tempos. Enquanto a maior parte do seu código é sobre a solução de problemas físicos (não criando GUIs ou fazendo outras coisas legais), o código FORTRAN será fácil de manter.

Eu recomendaria o Python apenas se você gosta de programação. Pense no seguinte: quando você codifica uma solução para um problema de física, gosta de programar parte da solução? Se o fizer, o Python é uma opção, porque a linguagem é muito melhor que a do MATLAB.

Aksakal
fonte
2
Sua declaração sobre as diferenças de desempenho na mudança de MATLAB para Fortran não é verdadeira em geral. O Fortran é ótimo se você estiver escrevendo um código para quais matrizes são uma estrutura de dados naturalmente boa, se pode viver como ele lida com E / S e se possui as bibliotecas necessárias. As bibliotecas numéricas no Python se sobrepõem fortemente à funcionalidade do MATLAB, e acho mais fácil escrever interfaces Python no código C do que as interfaces MATLAB no código C.
Geoff Oxberry
Às vezes você não vê muita diferença. Reescrevi recentemente um programa de simulação de física do Matlab (usando o pacote bvp6c internamente) para o Fortran 2008 (usando o pacote bvp_solver internamente), e o tempo de execução caiu para apenas 1,4% após a troca, mesmo que eu não tenha alterado os algoritmos ou estrutura geral do programa. Para uma simulação que exigia ~ 3,5 dias por ponto de dados para convergir, essa foi uma melhoria muito perceptível.
Jabirali