OpenGL 시뮬레이션을 더 빨리 실행하려고 할 때이 함수를 최적화해야합니다. Parakeet을 사용하고 싶지만, 그렇게하기 위해 아래 코드를 수정해야하는 방법을 이해할 수 없습니다. 내가해야 할 일을 볼 수 있니?Parakeet으로 파이썬 함수 최적화
def distanceMatrix(self,x,y,z):
" ""Computes distances between all particles and places the result in a matrix such that the ij th matrix entry corresponds to the distance between particle i and j"" "
xtemp = tile(x,(self.N,1))
dx = xtemp - xtemp.T
ytemp = tile(y,(self.N,1))
dy = ytemp - ytemp.T
ztemp = tile(z,(self.N,1))
dz = ztemp - ztemp.T
# Particles 'feel' each other across the periodic boundaries
if self.periodicX:
dx[dx>self.L/2]=dx[dx > self.L/2]-self.L
dx[dx<-self.L/2]=dx[dx < -self.L/2]+self.L
if self.periodicY:
dy[dy>self.L/2]=dy[dy>self.L/2]-self.L
dy[dy<-self.L/2]=dy[dy<-self.L/2]+self.L
if self.periodicZ:
dz[dz>self.L/2]=dz[dz>self.L/2]-self.L
dz[dz<-self.L/2]=dz[dz<-self.L/2]+self.L
# Total Distances
d = sqrt(dx**2+dy**2+dz**2)
# Mark zero entries with negative 1 to avoid divergences
d[d==0] = -1
return d, dx, dy, dz
내가 말할 수있는 것부터, 앵무새가 수정없이 위의 기능을 사용할 수 있어야합니다. 단지 Numpy와 수학 만 사용합니다. 앵무새의 일종 JIT 래퍼에서 함수를 호출 할 때, 나는 항상 다음과 같은 오류가 발생합니다 :
AssertionError: Unsupported function: <bound method Particles.distanceMatrix of <particles.Particles instance at 0x04CD8E90>>
하나의 가능한 최적화는'self.L/2'의 12 가지 사용을 단일 로컬 변수로 대체하는 것입니다. 그것은 뭔가를 할 수 있습니다. :-) (비록 이것이 앵무새의 문제에 도움이되지 않지만 ... 미안) –
나는 부울 인덱스가 지원되지 않는다고 생각 하겠지만 확실하지는 않습니다. 나는'xtemp'와'dx> L/2' 같은 중간 배열을 할당하는 것이 낭비라는 것을 알고 있습니다. 벡터화 된 코드는 보통 numpy에서 빠르지 만 JIT 컴파일러를 사용하면 무딘 for-loops를 사용하는 것이 좋습니다! –