我正在用python进行性能测试。通过以不同的方式索引大型数组,我获得了完全不同的性能。这是我当前项目中的一些内容
import numpy as np
import time
N=100000
i=0
rep=1000
x1=np.random.randn(N,4)
x2=np.random.randn(4,N)
G1=np.random.randn(N,4,3)
G2=np.random.randn(4,N,3)
B=np.random.randn(N,3)
starttime=time.time()
for k in range(rep):
x1[:,i]=(G1[:,i,:] * B[:,:]).sum(axis=1)
elapsedtime1=time.time()-starttime
starttime=time.time()
for k in range (rep):
x2[i,:]=(G2[i,:,:] * B[:,:]).sum(axis=1)
elapsedtime2=time.time()-starttime
print ("elaplsedtime1= "+str(elapsedtime1))
print ("elaplsedtime2= "+str(elapsedtime2))
diff=(elapsedtime2-elapsedtime1)/elapsedtime2
print ("diff= "+str(diff))
我得到了这些结果:
% python test.py
elaplsedtime1= 2.46446800232
elaplsedtime2= 1.52360200882
diff= -0.617527404173
换句话说,这两种计算有60%的性能差异。这是否出乎意料?
正如评论中已经回答的那样,性能上的差异可能是由于索引
然而,我注意到,当使用numpy时,在维度很小的轴上调用sum时,效率很差(在您的例子中是3)
对于您的测试用例,您仍然可以通过将对sum函数的调用替换为一个矩阵乘积操作,并使用一个1的向量来获得额外的100%的加速
在这里,我添加了一个维度变量D(在您的例子中,D=3):
我得到了这些结果:
请注意,即使在运行中创建了矢量,速度也会保持不变。然而,当尺寸D增加时,加速降低
希望这有帮助
相关问题 更多 >
编程相关推荐