Versión original en inglés de J.R. Johansson (robert@riken.jp) http://jrjohansson.github.io/
También se han incluido elementos del tutorial de Damián Avila https://github.com/damianavila/Python-Cientifico-HCC
Traducido/Adaptado por G.F. Rubilar.
La última versión de estos notebooks de IPython está disponible en http://github.com/gfrubi/clases-python-cientifico.
La última versión del original (en inglés) de estos notebooks de IPython está disponible en http://github.com/jrjohansson/scientific-python-lectures.
Los otros notebooks de esta serie están listados en http://jrjohansson.github.com.
La Ciencia es dividida tradicionalmente en una rama experimental y una teórica, pero durante las últimas décadas la computación ha emergido como una parte muy importante de la Ciencia. La computación científica está a menudo muy relacionada con la teoría, pero posee también muchas características comunes con el trabajo experimental. Es por esto que a menudo es vista como una tercera rama de las ciencias. En muchos campos de la Ciencia, el trabajo computacional es un complemento importante tanto para el experimento como para la teoría, y actualmente una gran mayoría de las publicaciones experimentales y teóricas involucran cálculos numéricos, simulaciones y/o modelamiento computacional.
En las áreas experimentales y teóricas existen códigos de conducta bien establecidos referentes a cómo los resultados y métodos son publicados y puestos a disposición de otr@s científic@s. Por ejemplo, en las áreas teóricas, las derivaciones, demostraciones y otros resultados son publicados en detalle, o disponibles bajo solicitud. Similarmente, en el trabajo experimental, los métodos usados y los resultados son publicados, y todos los datos experimentales debiesen estar disponibles al ser solicitados. Se considera una práctica anticientífica el ocultar detalles cruciales de una prueba teórica o de un método experimental, que pudiesen impedir que otr@s científic@s reproduzcan los resultados.
En las ciencias computacionales no existen aún guías bien establecidas de cómo debiesen ser manejados el código fuente y los datos generados. Por ejemplo, es relativamente raro que el código fuente usado en simulaciones en artículos publicados sea puesto a disposición de los lectores, en contraste con la naturaleza abierta del trabajo experimental y teórico. Además, no es poco común que el código fuente del software de simulación sea reservado y considerado como una ventaja competitiva (o no necesario de ser publicado).
Sin embargo, este punto a comenzado a atraer cada vez mayor atención, y algunas editoriales de revistas de alto nivel han hecho llamados a una mayor transparencia en las ciencias computacionales. Algunas revistas prestigiosas, incluyendo Science, han comenzado a requerir que los autores suministren a los lectores, luego de solicitarlo, el código fuente del software de simulación usado en las publicaciones.
También se está discutiendo cómo facilitar la distribución de software científico, por ejemplo como material suplementario a los artículos científicos.
Reproducible Research in Computational Science, Roger D. Peng, Science 334, 1226 (2011).
Shining Light into Black Boxes, A. Morin et al., Science 336, 159-160 (2012).
The case for open computer programs, D.C. Ince, Nature 482, 485 (2012).
Replicación y reproducibilidad son dos pilares del método científico. Respecto al trabajo numérico, el satisfacer estos requerimientos implica las siguientes consideraciones prácticas:
Replicación: Un(a) autor(a) de un artículo científico que involucra cálculos numéricos debería ser capaz de reproducir los resultados.
Reproducibilidad: Otr@s científic@s deberían ser capaces de realizar las mismas simulaciones numéricas y obtener los mismos resultados, dada la información acerca de los métodos usados en una publicación.
Para alcanzar estos objetivos, necesitamos:
Mantener y documentar exactamente qué código fuente y qué versión fue usada para producir los datos y figuras en artículos publicados.
Registrar información sobre qué versión de software externos ha sido usada. Mantener acceso al entorno que fue usado.
Asegurarse que los códigos antiguos son respaldados y mantenidos para futura referencia.
Estar preparado para suministrar información adicional sobre los métodos usados, y tal vez adicionalmente los códigos de simulación, a un lector interesado que lo solicite (incluso años después que el artículo fue publicado!).
Idealmente, los códigos deberían ser publicados en la red, para facilitar que otr@s científic@s interesad@s en el código puedan tener acceso a él.
Asegurar la replicabilidad y la reproducibilidad de simulaciones científicas es un problema complicado, pero existen buenas herramientas que ayudan en esta tarea:
Sistemas de Control de Revisión (Revision Control System, RCS).
hg
.svn
.Repositorios Online para código fuente. Disponibles tanto como repositorios públicos como privados.
Los repositorios son además excelentes para controlar versiones de manuscritos, figuras, archivos de tesis, archivos de datos, bitácoras de laboratorio, etc. Básicamente para todo contenido digital que deba ser preservado y que es frecuentemente actualizado. Nuevamente, existen tanto repositorios públicos como privados. ¡Estas herramientas constituyen además muy buenas herramientas de colaboración!
Python es un lenguaje de programación moderno, de propósito general, orientado al objeto y de alto nivel. Fue creado por Guido van Rossum, conocido como el BDFL ("Benevolent Dictator for Life", es decir "Dictador Benevolente Vitalicio" del proyecto Python). La primera versión (0.9.0) de Python fue lanzada en 1991, y la versión 1.0 en 1994.
Algunos de los principios bajo los que está concebido el lenguaje (Tim Peters, "El Zen de Python") son:
Características generales de Python:
Detalles técnicos:
Ventajas de Python:
Desventajas de Python:
Ventajas de Matlab:
Desventajas de Matlab:
Ventajas de Fortran, C, C++:
Desventajas de Fortan, C, C++:
Python tiene una posición fuerte en la computación científica:
Extenso ecosistema de librerías científicas y entornos
Gran desempeño debido a la gran integración con códigos altamente testeados y optimizados escritos en C y Fortran:
Buen soporte para:
Disponible y apropiado para uso con cluster de cálculo de alto desempeño (high-performance computing clusters).
¡Sin costos de licencia y de código abierto!.
Creciente y pujante comunidad apoyando el desarrollo y evolución del lenguaje.
Desventajas:
Python no es sólo un lenguaje de programación, sino que también la implementación estándar del intérprete (técnicamente llamado CPython) que realmente ejecuta el código Python en un computador.
Existen también muchos entornos distintos a través de los cuales se puede usar el intérprete Python. Cada entorno tiene distintas ventajas y es adecuado para diferentes rutinas de trabajo. Una fortaleza de Python es que es versátil y puede ser usado de formas complementarias, pero esto puede ser confuso para principiantes, por lo que comenzaremos con un breve vistazo de los entornos Python útiles en computación científica.
La forma estándar de usar el lenguaje de programación Python es usar el intérprete Python para ejecutar código Python. El intérprete Python es un programa que lee y ejecuta el código Python en archivos, que son pasados como argumentos. En la consola de comandos, el comando python
se usa para invocar al intérprete Python.
Por ejemplo, para ejecutar un archivo mi-programa.py
, que contiene código Python, desde la consola de comandos, use:
$ python mi-programa.py
Podemos también iniciar el intérprete simplemente escribiendo python
en la consola, y escribiendo interactivamente código en el intérprete.
Ésta es la forma en que a menudo deseamos trabajar desarrollando aplicaciones científicas, o cuando se realizan pequeños cálculos. Sin embargo, el intérprete Python estándar no es muy conveniente para este tipo de trabajo, debido a múltiples limitaciones.
IPython es una shell (intérprete de comandos) interactiva que resuelve muchas de las limitaciones del intérprete de Python estándar, y es una poderosa heramienta para uso científico de Python. IPython suministra una prompt interactiva, y mucho más amigable al usuario, del intérprete Python. IPython fue creado por Fernando Perez en 2001.
Una instancia de IPython corriendo en una consola luce así:
Algunas de las características más útiles de IPython son:
Spyder es un IDE (entorno de desarrollo interactivo, por su sigla en inglés) similar a MATLAB para computación científica con Python. Tiene muchas de las ventajas de un IDE, como por ejemplo que todo, desde la edición del código, su ejecución y depuración, es realizado en un mismo entorno, y el trabajo de diferentes cálculos puede ser organizado como proyectos en el IDE.
Algunas ventajas de Spyder:
IPython notebook es un entorno "de cuaderno'' basado en HTML para Python, similar a Mathematica o Maple. Originalmente estaba basado en la shell IPython, pero suministrando un ambiente basado en celdas con gran interactividad, donde los cálculos pueden ser organizados y documentados en una forma estructurada.
Aunque se usa el navegador web con interfase gráfica, los notebooks IPython/Jupyter usualmente se ejecutan localmente, en el mismo computador que ejecuta el navegador. Para iniciar una nueva sesión de IPython notebook, ejecute el siguiente comando:
$ ipython notebook
desde una carpeta en que que desea almacenar los cuadernos. Esto abrirá una nueva ventana del navegador (o una nueva pestaña en una ventana existente) con una página índice donde se muestran los cuadernos existentes y desde donde nuevos cuadernos pueden ser creados.
En el año 2014, los desarrolladores del Ipython Notebook decidieron crear el proyecto Jupyter que independiza la interfase del notebook del lenguaje de programación particular que se use (originalmente, Python). Esto permite usar las funcionalidades de interactividad de los notebooks con distintos lenguajes.
Existen actualmente dos versiones de Python: Python 2 y Python 3. Python 3 eventualmente reemplazará a Python 2, pero no es 100% compatible con Python 2. Mucho del código Python existente ha sido escrito para Python 2, y aún es la versión más popular. En estas clases cualquiera de las dos versiones puede usarse, pero es probablemente más simple quedarse con Python 2 por ahora, ya que está más comúnmente disponible en paquetes precompilados e instaladores binarios.
Para ver qué versión de Python tiene, ejecute
$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.0
Es posible instalar varias versiones de Python en paralelo.
En Linux Mint (también en Ubuntu, o en cualquier distribución derivada de Ubuntu), para instalar Python y todas sus dependencias, ejecute:
$ sudo apt-get install python ipython ipython-notebook
$ sudo apt-get install python-numpy python-scipy python-matplotlib python-sympy
$ sudo apt-get install spyder
Macports
Python está incluido por defecto en Mac OS X, pero para nuestros propósitos es útil instalar un nuevo entorno Python usando Macports, ya que hace mucho más fácil instalar todos los paquetes adicionales requeridos. Usando Macports, podemos instalar lo que necesitamos con:
> sudo port install py27-ipython +pyside+notebook+parallel+scientific
> sudo port install py27-scipy py27-matplotlib py27-sympy
> sudo port install py27-spyder
Esto asociará los comandos python
y ipython
con las versiones instaladas con macports (en lugar de las que vienen con Mac OS X), ejecute los siguientes comandos:
> sudo port select python python27
> sudo port select ipython ipython27
Fink
Alternativamente, puede usar el administrador de paquetes Fink. Luego de instalar Fink, use los siguientes comandos para instalar Python y los paquetes que necesitamos:
> sudo fink install python27 ipython-py27 numpy-py27 matplotlib-py27 scipy-py27 sympy-py27
> sudo fink install spyder-mac-py27
Windows carece de un buen sistema de empaquetado, de modo que la forma más fácil para configurar un entorno Python es instalar una distribución pre-empaquetada. Algunas buenas alternativas son:
Canopy y Anaconda también están disponibles para Linux y Mac OS X.
Python se ha convertido en un lenguaje muy popular para uso científico (salvo en ciertos nichos) debido a la multiplicidad de herramientas que brinda, a la potencialidad en el perfeccionamiento de las mismas y la continua generación de nuevos módulos cada vez más especializados.
Existen problemas que resolver y algunas cuestiones técnicas que desarrollar (no todo es color de rosa...).
Sin embargo, las perspectivas son muy buenas, lo cual se ve reflejado no sólo en la proliferación de científicos que usan Python en su trabajo diario, sino también en la organización de conferencias específicas a nivel internacional (SciPy, EuroSciPy, SciPyCon Argentina, etc.) y en el aumento del número de publicaciones con código escrito en Python.
Muchas empresas e industrias se valen de estas mismas herramientas para el desarrollo o análisis de sus procesos productivos.
En Inglés:
En Español: