gpt4 book ai didi

python for循环每次迭代变慢

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:06 27 4
gpt4 key购买 nike

我正在尝试优化一些 python 代码(以加速一些矩阵运算),我的代码与此类似(我的真实数据集也类似于“gps”),

import numpy as np
gps = [np.random.rand(50,50) for i in xrange(1000)]
ips = np.zeros( (len(gps),len(gps)), dtype='float32')

for i in xrange(len(gps)):
for j in xrange(0,i+1):
ips[i,j]= f.innerProd(gps[i],gps[j])
ips[j,i]= ips[i,j]
print "Inner product matrix: %3.0f %% done (%d of %d)"% \
(((i+1)**2.)/(len(gps)**2.)*100, i, len(gps))

def innerProd(mat1,mat2):
return float(np.sum(np.dot(np.dot(mat1,mat2),mat1)))

我想了解的是,为什么程序在第一次迭代时开始快速运行,然后随着进一步迭代而变慢?我知道这个问题可能有点天真,但我真的想在尝试其他任何事情之前更清楚地了解正在发生的事情。我已经在 Fortran 中实现了我的函数(在 Fortran 领域内留下任何 for 循环)并使用 f2py 创建一个动态库以从 python 调用该函数,这将是 python 中的新代码..

import numpy as np
import myfortranInnProd as fip

gps = [np.random.rand(50,50) for i in xrange(1000)]
ips = np.zeros( (len(gps),len(gps)), dtype='float32')

ips = fip.innerProd(gps)

不幸的是,我只发现(令人惊讶地)我的 fortran-python 版本比第一个版本慢 1.5 ~ 2 倍(重要的是要提到我在 Fortran 实现上使用了 MATMUL())。我在谷歌上搜索了一段时间,我相信这种“减速”与内存带宽、内存分配或缓存有关,因为数据集很大,但我不太确定背后到底发生了什么以及如何发生我可以提高性能吗?我已经在一个小型英特尔原子、2GB 内存和一个 4 核英特尔至强处理器上运行了代码,内存为 8GB(当然具有相应缩放的数据集)并且“减速”行为是相同的。

我只需要了解为什么会发生这种“减速”?如果我在 C 中实现该功能会有什么好处吗?或者尝试实现它在 GPU 上运行?任何其他想法如何改进它?提前致谢

最佳答案

冒着显而易见的风险,每次执行外循环时,内循环的执行次数都会增加。当i为0时,内层循环只会执行一次,而当i为100时,会执行101次。这可以解释您的观察结果,还是您的意思是随着时间的推移,内部循环本身的每次执行都变得越来越慢?

关于python for循环每次迭代变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5845826/

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