簡體   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