gpt4 book ai didi

python - 讲解numpy向量化函数应用VS python for循环的速度差异

转载 作者:太空狗 更新时间:2023-10-29 17:30:47 25 4
gpt4 key购买 nike

我在一组 42000 张图像上实现了一个称为 TF-IDF 的加权系统,每张图像包含 784 个像素。这基本上是一个 42000 x 784 矩阵。

我尝试的第一种方法使用了显式循环并花费了 2 个多小时

def tfidf(color,img_pix,img_total):
if img_pix==0:
return 0
else:
return color * np.log(img_total/img_pix)

...

result = np.array([])
for img_vec in data_matrix:
double_vec = zip(img_vec,img_pix_vec)
result_row = np.array([tfidf(x[0],x[1],img_total) for x in double_vec])
try:
result = np.vstack((result,result_row))
# first row will throw a ValueError since vstack accepts rows of same len
except ValueError:
result = result_row

我尝试的第二种方法使用了 numpy 矩阵,用了不到 5 分钟。请注意,data_matrix、img_pix_mat 都是 42000 x 784 矩阵,而 img_total 是标量。

result = data_matrix * np.log(np.divide(img_total,img_pix_mat))

我希望有人能解释速度上的巨大差异

以下题为“NumPy 数组:一种用于高效数值计算的结构”(http://arxiv.org/pdf/1102.1523.pdf) 的论文的作者在第 4 页的顶部声明,由于向量化计算,他们观察到速度提高了 500 倍。我假设我看到的大部分速度提升都是由于这个原因造成的。但是,我想更进一步,问为什么 numpy 向量化计算比标准 python 循环快得多?

另外,也许你们知道第一种方法慢的其他原因。 try/except 结构是否有很高的开销?或者可能为每个循环形成一个新的 np.array 需要很长时间?

谢谢。

最佳答案

由于 numpy 的内部工作方式,(据我所知,numpy 在内部与 C 一起工作,所以你下推到 numpy 的所有东西实际上要快得多,因为它使用不同的语言)

编辑:取出 zip,并用 vstack 替换它也应该更快,(如果参数非常大,zip 往往会变慢,并且比 vstack 更快),(但这也是将它放入 numpy 的东西(因此进入C), 而 zip 是 python)

是的,如果我理解正确 - 不确定 - ,你正在做 42k 次 try/except block ,这肯定对速度不利,

测试:

T=numpy.ndarray((5,10))
for t in T:
print t.shape

结果在 (10,)

这意味着是的,如果你的矩阵是 42kx784 矩阵,你正在尝试一个 try-except block 42k 次,我假设这应该会影响计算时间,以及每次都做一个 zip,但不确定这是否是主要原因,

(所以你运行你的东西的 42k 次中的每一次,都需要 0.17 秒,我很确定一个 try/except block 不会花费 0.17 秒,但也许它造成的开销确实对它有所贡献?

尝试更改以下内容:

double_vec = zip(img_vec,img_pix_vec)
result_row = np.array([tfidf(x[0],x[1],img_total) for x in double_vec])

result_row=np.array([tfidf(img_vec[i],img_pix_vec[i],img_total) for i in xrange(len(img_vec))])

至少摆脱了 zip 语句,但不确定 zip 语句是否会减少你的时间一分钟或将近两个小时(我知道 zip 很慢,与 numpy vstack 相比,但不知道是否会给你两个小时的时间)

关于python - 讲解numpy向量化函数应用VS python for循环的速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com