行者浩 发表于 2023-3-29 19:22:27

向量化和非向量化为什么计算结果不同呢?

求问各位佬,下面代码块里面,一个是利用numpy库函数进行计算,另一个则是for循环遍历计算,为什么结果不同呢?
贴上代码:
import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

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

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

Vectorized version:6.287813186645508ms
Result:249650.1394189563
For loop:446.8402862548828ms
Result:249650.13941896067

isdkz 发表于 2023-3-29 19:25:15

您好!代码中的两个方法实际上计算的都是向量a和向量b之间的点积。两个方法的结果略有不同,这主要是因为浮点数的运算精度问题。

在Python中,浮点数的运算并不是完全精确的,这是由于计算机在表示浮点数时只能使用有限数量的位数,这可能导致在进行浮点数运算时产生一定程度的误差。而在这个例子中,numpy库和for循环使用了不同的计算方法,导致了这种误差的累积。

numpy库中的np.dot()函数使用了高度优化的矩阵运算库,例如BLAS(基本线性代数子程序库),可以加速计算过程,同时其实现方式也可能影响计算结果的精度。而在for循环中,计算是按顺序逐个进行的,这种计算方式可能导致误差的累积。

综上所述,这两种方法得到的结果略有不同,但差异非常小,可以认为是计算机浮点数运算精度的限制导致的。从性能角度来看,numpy库的向量化计算方法更加高效,大大减少了计算时间。
页: [1]
查看完整版本: 向量化和非向量化为什么计算结果不同呢?