繁体   English   中英

numpy 的奇怪性能结果

[英]Strange performance results with numpy

我正在 python 中进行性能测试。 通过以不同方式索引大 arrays,我得到了完全不同的性能。 这是我当前项目中的一些内容。

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% 加速,方法是将调用和 function 替换为带有一个向量的矩阵乘积运算。

在这里,我添加了一个维度变量 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 增加时,加速会降低。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM