Python - 循环加速 - 大数据集
Python - Speed-up for loops - large data sets
我是 Python 的新手,我需要加速这个简单的代码。
我在 Matlab 中创建了这段代码,它“立即”运行。
我尝试在 Python 中 'convert' 它,但它非常慢...
在我最后的代码中,这块操作要循环上千次...
所以最后,代码的这个特定部分需要尽可能高效...
# 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”可以大到'millions'......而“b”可以大到几十万......
不好玩...
有什么建议吗?
非常感谢您的帮助!
比纳比克
一般来说,在处理 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)
我是 Python 的新手,我需要加速这个简单的代码。
我在 Matlab 中创建了这段代码,它“立即”运行。 我尝试在 Python 中 'convert' 它,但它非常慢...
在我最后的代码中,这块操作要循环上千次... 所以最后,代码的这个特定部分需要尽可能高效...
# 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”可以大到'millions'......而“b”可以大到几十万...... 不好玩...
有什么建议吗?
非常感谢您的帮助!
比纳比克
一般来说,在处理 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)