Introducción a la Computación Científica con Python

Versión original en inglés de J.R. Johansson ([email protected]) 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.

El rol de la computación en las Ciencias

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 [email protected] cientí[email protected] 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 [email protected] cientí[email protected] 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.

Referencias

Requisitos para la Computación Científica

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: [email protected] cientí[email protected] 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 [email protected] cientí[email protected] [email protected] en el código puedan tener acceso a él.

Herramientas para manejar código fuente

Asegurar la replicabilidad y la reproducibilidad de simulaciones científicas es un problema complicado, pero existen buenas herramientas que ayudan en esta tarea:

Notas

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!

El Lenguaje de programación Python

¿Qué es Python?

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:

  • Bello es mejor que feo.
  • Explícito es mejor que implícito.
  • Simple es mejor que complejo.
  • Complejo es mejor que complicado.
  • La legibilidad cuenta.
  • Los casos especiales no son tan especiales como para quebrantar las reglas.

Características generales de Python:

  • Lenguaje fácil de aprender.
  • Lenguaje versátil en su utilización.
  • Lenguaje limpio y simple: Código fácil de leer e intuitivo, sintaxis minimalista y fácil de aprender. Su mantención escala bien con el tamaño de los proyectos.
  • Incorpora una colección de herramienta básicas para el tratamiento y visualización de datos.
  • Suministra un "entorno" unificado e interactivo.
  • Requiere un tiempo de desarrollo reducido y un tiempo de ejecución razonable.

Detalles técnicos:

  • Tipado dinámico: No se necesita definir el tipo de las variables, argumentos de funciones, ni tipos de retorno.
  • Manejo de memoria automático: No se necesita reservar explícitamente memoria para las variables y los arreglos de datos. Sin bugs de fuga de memoria.
  • Interpretado: No se requiere compilar el código. El intérprete Python lee y ejecuta el código python directamente.

Ventajas de Python:

  • La principal ventaja es la facilidad de programar, minimizando el tiempo requerido para desarrollar, depurar y mantener el código.
  • Lenguaje bien diseñado que fomenta muchas buenas prácticas de programación:
    • Programación modular y orientada al objeto, buen sistema para empaquetar y reusar código. Esto a menudo resulta en un código más transparente, mantenible, y libre de bugs.
    • Documentación estréchamente integrada al código.
  • Un gran librería estandar, y una gran colección de paquetes externos.

Desventajas de Python:

  • Como Python es un lenguaje interpretado y de tipado dinámico, la ejecución de código python puede ser lenta comparada con lenguajes compilados y de tipado estático, tales como C y Fortran.
  • Algo descentralizado, con diferentes ambientes, paquetes y documentación diseminada en distintos lugares. Esto puede hacer difícil el comienzo.

Python versus Matlab

Ventajas de Matlab:

  • Múltiples bibliotecas con numerosos algoritmos para la resolución de diferentes problemas.
  • Una rápida ejecución debido a que las bibliotecas están, normalmente, escritas en un lenguaje compilado.
  • Un entorno de desarrollo agradable y funcional.
  • Soporte comercial disponible.

Desventajas de Matlab:

  • El lenguaje de base puede ser restrictivo para usuarios avanzados. No hay acceso al código fuente.
  • "Show me the money..."

Python versus lenguajes compilados (Fortran, C, C++)

Ventajas de Fortran, C, C++:

  • Rápidos.
  • Compiladores super optimizados.
  • Bibliotecas científicas super optimizadas (desde antaño).

Desventajas de Fortan, C, C++:

  • No hay interactividad durante el desarrollo (necesariamente, hay un paso de compilación).
  • Sintaxis compleja.
  • Manejo manual de la memoria.

¿Qué hace a Python adecuado para la Computación Científica?

  • Python tiene una posición fuerte en la computación científica:

    • Gran comunidad de usuarios. Es fácil encontrar ayuda y documentación.
  • 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:

    • blas, atlas blas, lapack, arpack, Intel MKL, ...
  • Buen soporte para:

    • Procesamiento en paralelo.
    • Comunicación entre procesos (Interprocess communication, MPI).
    • Cálculo con GPU (OpenCL y CUDA).
  • 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:

  • Un entorno de desarrollo menos agradable comparado con Matlab (totalmente discutible.... Esto está cambiando rápidamente gracias a los IPython Notebooks).
  • Algunos algoritmos especializados todavía no se han desarrollado (pero no falta mucho...).
  • Relativamente lento... (varias soluciones disponible y en desarrollo).

La estructura de datos (pila) de Python Científico

Entornos Python

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.

Intérprete Python

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

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:

  • Historial de comandos, que puede ser navegado con las teclas de flechas hacia arriba y abajo.
  • Autocompletación de tabs.
  • Edición de código en línea.
  • Introspección de objetos, y extracción automática de cadenas de documentación a partir de objetos Python como clases y funciones.
  • Buena interacción con la línea de comandos del sistema operativo.
  • Soporte de múltiples procesos paralelos back-end, que pueden ejecutarse en cluster computacionales o en servicios en la nube como Amazon EE2.

Spyder

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:

  • Poderoso editor de código, con coloreado de sintaxis, introspección dinámica de código, e integración con el depurador de Python.
  • Explorador de variables, prompt de comando IPython.
  • Documentación y ayuda integrada.

IPython (Jupyter) notebook

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.

Versiones de Python

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.

Instalación

Linux

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

Mac OS

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

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. Canopy es un producto comercial, de la empresa Enthought, pero disponible gratuitamente para uso académico.
  • Anaconda. Anaconda, de la empresa Continuum, también es un producto comercial, pero existe una versión de uso gratuito.
  • Python(x,y). Completamente de código abierto y gratuita.

Nota

Canopy y Anaconda también están disponibles para Linux y Mac OS X.

Presente y Futuro

  • 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.

Material adicional

En Inglés:

  • Python. El sitio oficial de Python.
  • Think Python. Un libro gratuito sobre Python.
  • Pyvideo. Colección de videos sobre Python (tutoriales, conferencias, etc.).

En Español: