鱼C论坛

 找回密码
 立即注册
查看: 1812|回复: 1

[已解决]向量化和非向量化为什么计算结果不同呢?

[复制链接]
发表于 2023-3-29 19:22:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求问各位佬,下面代码块里面,一个是利用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[i] * b[i]
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
最佳答案
2023-3-29 19:25:15
您好!代码中的两个方法实际上计算的都是向量a和向量b之间的点积。两个方法的结果略有不同,这主要是因为浮点数的运算精度问题。

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

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

综上所述,这两种方法得到的结果略有不同,但差异非常小,可以认为是计算机浮点数运算精度的限制导致的。从性能角度来看,numpy库的向量化计算方法更加高效,大大减少了计算时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-29 19:25:15 | 显示全部楼层    本楼为最佳答案   
您好!代码中的两个方法实际上计算的都是向量a和向量b之间的点积。两个方法的结果略有不同,这主要是因为浮点数的运算精度问题。

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

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

综上所述,这两种方法得到的结果略有不同,但差异非常小,可以认为是计算机浮点数运算精度的限制导致的。从性能角度来看,numpy库的向量化计算方法更加高效,大大减少了计算时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 21:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表