Do operations without explicitly iterating over each element in the structure (vector), one by one, but manipulate it using vector operations.
ChatGPT: Vectorized operations are faster because they use optimized libraries, avoid unnecessary looping, take advantage of parallel processing, and have efficient memory access.
import numpy as np
import time;
array = np.array([1,2,3,4])
array
array([1, 2, 3, 4])
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c_vec = np.dot(a,b)
toc = time.time()
print("Vectorized version: " + str(1000*(toc-tic)) + "ms")
Vectorized version: 0.5021095275878906ms
# c_non_vec = 0
tic_non_vectorized = time.time()
# for i in range(1000000):
# c_non_vec += a[i]*b[i]
c_non_vec = sum([a[i]*b[i] for i in range(1000000)])
toc_non_vectorized = time.time()
print("Non vectorized version: " + str(1000*(toc_non_vectorized-tic_non_vectorized)) + "ms")
Non vectorized version: 312.34097480773926ms
print(f"Vectorized result: {c_vec}")
print(f"Non vectorized result: {c_non_vec}")
Vectorized result: 249655.99738514755 Non vectorized result: 249655.9973851444
If you need to apply a exponential operation into each element of a matrix/vector
$v = [v_1, v_2, ..., v_n]$, $u = [e^{v_1}, e^{v_2}, ..., e^{v_n}]$
Code example non vectorized:
u = np.zeros((n,1))
for i in range(n):
u[i] = math.exp(v[i])
Code example vectorized:
u = np.exp(v)
Other vectorized expressions
np.log(v)
np.abs(v)
np.maximum(v, 0)