17. Para onde ir a partir daqui?¶
Aprender uma linguagem de programação é o primeiro passo para tornar-se um “computacionalista” que queira fazer avançar a ciência e a engenharia através de modelagem computacional e simulação.
Enumeramos algumas habilidades adicionais que podem ser muito benéficas para o trabalho diário do cientista computacional, mas é claro que elas não são exaustivas.
17.1. Programação avançada¶
Este texto enfatizou a formação de uma base sólida em termos de programação, abrangendo fluxo de controle, estruturas de dados e elementos da programação procedural e funcional. Não falamos de Orientação a Objetos em grande detalhe, nem discutimos alguns dos recursos mais avançados do Python, como iteradores e decoradores, por exemplo.
17.2. Linguagem de programação compilada¶
Quando o desempenho começa a ser a prioridade máxima, talvez seja necessário usar código compilado, e provavelmente incorporá-lo em um código Python para realizar os cálculo nas partes onde há deficiência de desempenho (bottlenecks).
Fortran, C e C++ são escolhas sensíveis por enquanto. Talvez Julia num futuro próximo.
Também precisamos aprender a integrar código compilado com Python usando ferramentas como Cython, Boost, Ctypes e Swig.
17.3. Teste¶
Uma boa codificação é suportada por uma série de testes de unidades e sistemas que podem ser executados rotineiramente para verificar se o código funciona corretamente. Ferramentas como doctest
, nose
e pytest
são inestimáveis, e devemos aprender, pelo menos, como usar o pytest
(ou o nose
).
17.4. Modelos de simulação¶
Uma série de ferramentas-padrão para simulações, como Monte Carlo, Dinâmica Molecular, modelos baseados em lattice, diferenças finitas e elementos finitos, são comumente usados para resolver desafios específicos de simulação - é útil ter pelo menos uma visão geral deles.
17.5. Engenharia de software para códigos de pesquisa¶
Os códigos de pesquisa trazem desafios particulares: os requisitos podem mudar durante o tempo de execução do projeto. Precisamos de grande flexibilidade e reprodutibilidade. Uma série de técnicas estão disponíveis para dar suporte de forma eficaz.
17.6. Dados e visualização¶
Lidar com grandes quantidades de dados, processá-los e visualizá-los pode ser um desafio. Conhecimento fundamental de projeto de banco de dados, visualização 3D e ferramentas modernas de processamento de dados, como o pacote Pandas do Python, ajudam com isso.
17.7. Controle de versão¶
O uso de uma ferramenta de controle de versão, como git ou mercurial, deve ser uma abordagem padrão e melhora significativamente a eficácia da escrita de código, ajuda com o trabalho em equipe e - talvez o mais importante - suporta a reprodutibilidade de resultados computacionais.
17.8. Execução paralela¶
A execução paralela de códigos é uma maneira de tornar códigos em grande escala mais ágeis. Isso pode ser pelo uso de MPI para a comunicação inter-node ou OpenMP para a paralelização intra-node, ou um modo híbrido que integre ambos.
O recente aumento da computação GPU fornece ainda outra via de paralelização, e também os processadores multinúcleo, como o Intel Phi.
17.8.1. Agradecimentos¶
Marc Molinari, por revisar este manuscrito em 2007.
Neil O’Brien, por contribuir para a seção SymPy.
Jacek Generowicz, por me apresentar o Python no último milênio, e por gentilmente compartilhar inúmeras idéias de seu curso de Python.
EPSRC, pelo suporte parcial deste trabalho (GR/T09156/01 e EP/G03690X/1).
Estudantes e outros leitores que comentaram e/ou apontaram erros de digitação, etc.
[1] a linha vertical é mostrar apenas a divisão entre os componentes originais apenas; matematicamente, a matriz aumentada comporta-se como qualquer outra matriz 2 × 3, e nós a codificamos no SymPy como faríamos com qualquer outra.
[2] a partir da documentação help(preview)
: “Atualmente isso depende do pexpect, que não está disponível para Windows”.
[3] O valor exato para o limite superior está disponível em sys.maxint
.
[4] Adicionamos, por completeza, que um programa C (ou C++/Fortran) que execute o mesmo laço será cerca de 100 vezes mais rápido do que o laço float
do Python e, portanto, cerca de 100*200 = 20000 vezes mais rápido que o laço simbólico.
[5] Neste texto, geralmente fazemos a importação do numpy
com o nome N
assim: import numpy as N
. Se você não tiver numpy
na sua máquina, você pode substituir esta linha por import Numeric as N
, ou import numarray as N
.
[6] Nota histórica: isso mudou da versão Scipy 0.7 para 0.8. Antes da 0,8, o valor de retorno era um float
se um problema unidimensional fosse resolvido.