Wenn es n-dimensionale Vektoren w und x gibt, ist es ineffizient, wenn die for-Anweisung zur Berechnung von $ z = w_1x_1 + w_2x_2 ... w_nx_n $ verwendet wird. Wenn es vektorisiert ist, kann es effizient berechnet werden, indem $ z = w ^ Tx + b $ gesetzt wird. In Python können Sie mit dem folgenden Code vergleichen.
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a, b)
toc = time.time()
print(f'{"Vectrized version":20}:{str(1000 * (toc-tic))} ms')
c = 0
tic = time.time()
for i in range(1000000):
c += a[i] * b[i]
toc = time.time()
print(f'{"For loop":20}:{str(1000 * (toc-tic))} ms')
Vectrized version :3.9501190185546875 ms
For loop :1007.7228546142578 ms
Angenommen, Sie möchten eine Exponentialoperation für einen 1000000-Dimensionsvektor $ v $ ausführen.
import numpy as np
import time
import math
v = np.random.rand(1000000)
u = np.zeros((1000000, 1))
tic = time.time()
u = np.exp(v)
toc = time.time()
print(f'{"Vectrized version":20}:{str(1000 * (toc-tic))} ms')
c = 0
tic = time.time()
for i in range(1000000):
u[i] = math.exp(v[i])
toc = time.time()
print(f'{"For loop":20}:{str(1000 * (toc-tic))} ms')
Vectrized version :3.992319107055664 ms
For loop :857.1090698242188 ms
Zwischen der vektorisierten Version und der nicht vektorisierten Version besteht ein etwa 300-facher Unterschied. Wenn ich for-loop verwenden möchte, möchte ich mir überlegen, wie ich es vermeiden kann.
Recommended Posts