MENU

Vectorization

March 29, 2019 • Read: 74 • Deep Learning

在 Logistic 回归中,需要计算

$$ z=w^Tx+b $$

如果是非向量化的循环方式操作,代码可能如下:

z = 0
for i in range(n_x):
    z += w[i] * x[i]
z += b

而如果是向量化的操作,代码则会简洁很多,并带来近百倍的性能提升(并行指令):

z = np.dot(w, x) + b

让我们用一个小例子说明一下(以下为教授在他的Jupyter notebook上写的Python代码)

import numpy as np
a = np.array([1, 2, 3, 4])
print(a)

import time
a = np.random.rand(1000000)
b = np.random.rand(1000000) # Two arrays of one million dimensions are randomly generated by round
tic = time.time() # measure current time

# Vectorized version
c = np.dot(a, b)
toc = time.time()
print("Vectorized version:" + str(1000*(toc - tic)) + "ms")

# For loop
c = 0
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()
print("For loop:" + str(1000*(toc - tic)) + "ms")

在两个方法中,向量化和非向量化计算了相同的值,向量化版本花费了1.5毫秒,非向量化版本的for循环花费了大约几乎500毫秒,非向量化版本多花费了300倍时间。这意味着如果向量化方法需要花费一分钟去运行的数据,for循环将会花费5个小时去运行

以下代码及运行结果截图:

Archives Tip
QR Code for this page
Tipping QR Code