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! :-)