numpy的奇怪性能结果

2024-09-30 20:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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%的性能差异。这是否出乎意料?


Tags: importtimenpdiffrandom性能printx1
1条回答
网友
1楼 · 发布于 2024-09-30 20:35:29

正如评论中已经回答的那样,性能上的差异可能是由于索引

然而,我注意到,当使用numpy时,在维度很小的轴上调用sum时,效率很差(在您的例子中是3)

对于您的测试用例,您仍然可以通过将对sum函数的调用替换为一个矩阵乘积操作,并使用一个1的向量来获得额外的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增加时,加速降低

希望这有帮助

相关问题 更多 >