奇怪的性能结果与麻皮



我正在用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 时,在具有小维度(在您的情况下为 3(的轴上调用总和时效率很差。

对于您的测试用例,您仍然可以通过将对 sum 函数的调用替换为矩阵乘积运算来获得额外的 100% 加速。

在这里,我添加了一个维度变量 D(在您的情况下为 D=3(:

import numpy as np
import time
N=100000
i=0
rep=1000
D = 3
x1=np.random.randn(N,4)
x2=np.random.randn(4,N)
G1=np.random.randn(N,4,D)
G2=np.random.randn(4,N,D)
B=np.random.randn(N,D)
ones=np.ones((D,))
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):
x1[:,i]=(G1[:,i,:] * B[:,:]) @ ones
elapsedtime2=time.time()-starttime
print ("elaplsedtime1= "+str(elapsedtime1))
print ("elaplsedtime2= "+str(elapsedtime2))
diff=(elapsedtime2-elapsedtime1)/elapsedtime2
print ("diff12= "+str(diff))

我得到了这些结果:

% python3 script.py
elaplsedtime1= 2.2359278202056885
elaplsedtime2= 1.1143040657043457
diff12= -1.006568843300747

请注意,即使动态创建矢量,加速也会保持不变。然而,当维度D增加时,加速会降低。

希望这有帮助。

最新更新