Python - 循环加速 - 大型数据集
Posted
技术标签:
【中文标题】Python - 循环加速 - 大型数据集【英文标题】:Python - Speed-up for loops - large data sets 【发布时间】:2021-06-29 19:16:29 【问题描述】:我是 Python 新手,我需要加速这个简单的代码。
我在 Matlab 中创建了这段代码,它“立即”运行。 我试图在 Python 中“转换”它,但它非常慢......
在我的最终代码中,这个片段操作必须循环一千次...... 所以最后,代码的这个特定部分需要尽可能高效......
# a and B define the size of the data
a=9000
b=4000
c=np.ones((a,)) # not one in my code
d=np.random.rand(a,b) # not random in my code
res=np.zeros((b,1)) # pre-alloc
# here is the loop to be speed up !
tic = time.time()
for x in range(b):
res[x]=sum(c*d[:,x])
toc = time.time()
print(toc-tic)
只是为了让它更难......理论上,“a”可以大到“百万”......而“b”可以大到几十万...... 不好玩……
有什么建议吗?
非常感谢您的帮助!
比纳比克
【问题讨论】:
始终考虑标准操作(在这种情况下为向量矩阵乘积)。在这种情况下,它就像res=np.dot(c,d).reshape(-1,1)
一样简单,大约需要。 10 毫秒而不是 5 秒。 (快 5000 倍)
【参考方案1】:
一般来说,使用 numpy 数组时应避免循环,因为 numpy 向量化操作效率更高。这段代码给出了相同的结果:
a=9000
b=4000
c=np.ones((a,))
d=np.random.rand(a,b)
res=np.zeros((b,1))
# replaces the loop
(c*d.T).sum(axis=1).reshape(-1, 1)
【讨论】:
是的,避免循环对 numpy 数组执行操作是个好建议! 好点。它现在快 10 倍!有什么解决方案可以让它更快吗?当使用大的“a”和“b”时,Python 需要大量 RAM(和/或代码变慢),有没有办法优化这个? 注意:使用 float32 而不是 64 使其速度也快两倍。以上是关于Python - 循环加速 - 大型数据集的主要内容,如果未能解决你的问题,请参考以下文章
深入学习Google Colab:加载大型图像数据集的时间很长,如何加速这个过程?