어떻게 든 profpro와 코드 캐스팅을 numpy로 최적화하면 가능합니다. profiler에 따르면이 코드의 런타임은 95 %입니다. "B"는 형태의 배열이Numpy dot() 및 배열 캐스팅 performace 최적화
def evalSeriesInBasi(a,B):
Y = dot(a,B[0])
dY = dot(a,B[1])
ddY = dot(a,B[2])
return array([Y,dY,ddY])
def evalPolarForces(R, O):
# numexpr doest seem to help it takes 3,644 vs. 1.910 with pure numpy
G = 1.0/(R[0]**2) # Gravitational force
F_O = R[0] * O[2] + 2 * R[1] * O[1] # Angular Kinematic Force = Angular engine thrust
F_R = R[0] * O[1]**2 + R[2]
FTR = F_R - G
FT2 = F_O**2 + FTR**2 # Square of Total engine Trust Force (corespons to propelant consuption for power limited variable specific impulse engine)
return array([F_O,F_R,G,FTR, FT2])
def evalTrajectoryPolar(Rt0, Ot0, Bs, Rc, Oc):
Rt = Rt0 + evalSeriesInBasi(Rc,Bs)
Ot = Ot0 + evalSeriesInBasi(Oc,Bs)
Ft = evalPolarForces(Rt, Ot)
return Ot, Rt, Ft
(3,32,128)는 기저 함수가 저장되는 곳이다 (I 난 그냥 효과적으로 NumPy와 사용하는 방법을 배우고, f2py, 사이 썬 또는 pyOpenCl을 사용하지 않음) "a"는 이러한 기본 함수의 계수이며 Y, dY, ddY, F_O, F_R, G, FTR, FT2와 같은 다른 모든 배열은 128 개 샘플링 포인트에서 일부 함수의 값입니다.
numpy.core.multiarray.array 및 numpy.core._dotblas.dot
ncalls tottime percall cumtime percall filename:lineno(function)
22970 2.969 0.000 2.969 0.000 {numpy.core.multiarray.array}
46573 0.926 0.000 0.926 0.000 {numpy.core._dotblas.dot}
7656 0.714 0.000 2.027 0.000 basiset.py:61(evalPolarForces)
7656 0.224 0.000 0.273 0.000 OrbitalOptCos_numpyOpt.py:43(fitnesFunc)
7656 0.192 0.000 4.868 0.001 basiset.py:54(evalTrajectoryPolar)
116 0.141 0.001 5.352 0.046 optimize.py:536(approx_fprime)
7656 0.132 0.000 5.273 0.001 OrbitalOptCos_numpyOpt.py:63(evalFitness)
15312 0.101 0.000 2.649 0.000 basiset.py:28(evalSeriesInBasi)
array() 호출을 제거했을 때 3 배 빨라져서 감사합니다. 배열 ([무엇이든])은 배열을 복사하거나 배열이 아닌보기 만 생성하고, empty()는 배열을 할당합니다. –