Germán Racca Blog

Un blog sobre Fedora y Astrofísica

Python: ndarray vs. list

Este fin de semana comencé a leer un libro introductorio sobre SciPy y NumPy, al cual pueden verlo acá:

SciPy and NumPy (Optimizing & Boosting Your Python Programming)

Voy a comentar sobre un cálculo interesante que se habla en el segundo capítulo sobre la diferencia en la eficiencia computacional entre el objeto list y el objeto ndarray.

Las operaciones sobre los elementos de una lista sólo pueden ser hechas a través de bucles iterativos, lo cual es computacionalmente ineficiente en Python. El paquete NumPy permite superar las deficiencias de las listas de Python mediante un objeto para almacenamiento de datos llamado ndarray.

Utilizando el comando mágico %timeit de IPython, comparamos las diferencias en velocidad de ndarray de NumPy versus las listas de Python al ser multiplicados por un escalar. Primero creamos un array que contenga 1×107 elementos:

In [1]: import numpy as np

In [2]: arr = np.arange(1e7)

y luego convertimos el array en una lista:

In [3]: larr = arr.tolist()

En el caso de las listas, tenemos que crear una función para emular lo que ndarray puede hacer:

In [4]: def list_times(alist, scalar):
  ....:     for i, val in enumerate(alist):
  ....:         alist[i] = val * scalar
  ....:     return alist

Ahora hacemos el cálculo en IPython con %timeit, primero multiplicando el array por 1.1:

In [5]: %timeit arr * 1.1
10 loops, best of 3: 58.9 ms per loop

y luego haciendo lo mismo con la lista, usando la función creada para ello:

In [6]: %timeit list_times(larr, 1.1)
1 loops, best of 3: 1.44 s per loop

Esto nos muestra que la operación con el objeto ndarray es ~ 25 veces más rápida que el bucle con la lista. Por lo tanto, cuando sea posible, deberemos trabajar con objetos array en lugar de listas.

Interesante resultado para mí que soy un aprendiz de Python! :-)

Comments