파이썬으로 성능 테스트를하고 있습니다. 다양한 방식으로 큰 배열을 인덱싱하여 성능이 상당히 달라졌습니다. 여기 내 현재 프로젝트의 내용이 있습니다.
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 함수 호출을 행렬 곱 연산으로 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가 증가하면 속도 향상이 감소합니다.
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다