¿Qué es la vectorización?

¿Qué significa vectorizar los bucles for en Python? ¿Hay otra manera de escribir bucles for nesteds?

Soy nuevo en Python y en mi investigación, siempre me encuentro con la biblioteca NumPy. Espero que alguien pueda ayudarme.

Python for bucles es inherentemente más lento que su contraparte C.

Es por numpy que numpy ofrece acciones vectorizadas en arrays numpy . Empuja el bucle for que normalmente harías en Python hasta el nivel C, que es mucho más rápido. numpy ofrece numpy vectorizadas (“nivel C for bucle”) a las cosas que de otra manera tendrían que hacerse de manera inteligente (“nivel Python for bucle).

 import numpy as np from timeit import Timer li = list(range(500000)) nump_arr = np.array(li) def python_for(): return [num + 1 for num in li] def numpy_add(): return nump_arr + 1 print(min(Timer(python_for).repeat(10, 10))) print(min(Timer(numpy_add).repeat(10, 10))) # 0.725692612368003 # 0.010465986942008954 

La numpy vectorizada numpy fue x70 veces más rápida.

Aquí hay una definición de Wes McKinney:

Las matrices son importantes porque le permiten express operaciones por lotes en los datos sin escribir ninguno para los bucles. Esto generalmente se llama vectorización. Cualquier operación aritmética entre matrices de igual tamaño aplica la operación de manera elemental.

Versión vectorizada:

 >>> import numpy as np >>> arr = np.array([[1., 2., 3.], [4., 5., 6.]]) >>> arr * arr array([[ 1., 4., 9.], [ 16., 25., 36.]]) 

Lo mismo con los bucles en una lista nativa de Python (anidada):

 >>> arr = arr.tolist() >>> res = [[0., 0., 0.], [0., 0., 0.]] >>> for idx1, row in enumerate(arr): for idx2, val2 in enumerate(row): res[idx1][idx2] = val2 * val2 >>> res [[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]] 

¿Cómo se comparan estas dos operaciones? La versión NumPy tiene 436 ns; La versión de Python toma 3.52 µs (3520 ns). Esta gran diferencia en tiempos “pequeños” se llama microperformance, y se vuelve importante cuando se trabaja con datos más grandes o se repiten operaciones miles o millones de veces.