我随机比较了显式 for 循环 与 numpy 中的矢量化实现 的计算时间。我运行了整整 100 万次迭代,发现了一些惊人的差异。 For 循环花费了大约 646 毫秒,而 np.exp() 函数在不到 20 毫秒 内计算出相同的结果。
import time
import math
import numpy as np
iter = 1000000
x = np.zeros((iter,1))
v = np.random.randn(iter,1)
before = time.time()
for i in range(iter):
x[i] = math.exp(v[i])
after = time.time()
print(x)
print("Non vectorized= " + str((after-before)*1000) + "ms")
before = time.time()
x = np.exp(v)
after = time.time()
print(x)
print("Vectorized= " + str((after-before)*1000) + "ms")
我得到的结果:
[[0.9256753 ]
[1.2529006 ]
[3.47384978]
...
[1.14945181]
[0.80263805]
[1.1938528 ]]
Non vectorized= 646.1577415466309ms
[[0.9256753 ]
[1.2529006 ]
[3.47384978]
...
[1.14945181]
[0.80263805]
[1.1938528 ]]
Vectorized= 19.547224044799805ms
我的问题是:
- 第二种情况到底发生了什么?第一个是使用 一个明确的 for 循环,因此计算时间是合理的。 第二种情况的“幕后”发生了什么?
- 如何在不使用 numpy(在普通 Python 中)的情况下实现此类计算(第二种情况)?
请您参考如下方法:
发生的事情是 NumPy 正在调用非常擅长向量运算的高质量数值库(例如 BLAS)。
我想您可以具体调用 NumPy 使用的确切库,但是,NumPy 可能最清楚使用哪个库。
