2013-05-11 3 views
1

어떻게 든 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) 

답변

1

다시 계산하여 속도를 높일 수 있습니다 array() 전화를 이동, 여기에 예입니다

f1()f2()의 결과는 동일하지만 속도가 다른 경우

import numpy as np 

B = np.random.rand(3, 32, 128) 
a = np.random.rand(32, 32) 

def f1(a, B): 
    Y = dot(a,B[0]) 
    dY = dot(a,B[1]) 
    ddY = dot(a,B[2]) 
    return array([Y,dY,ddY]) 

def f2(a, B): 
    result = np.empty((B.shape[0], a.shape[0], B.shape[-1])) 
    for i in xrange(B.shape[0]): 
     np.dot(a, B[i], result[i]) 
    return result 

r1 = f1(a, B) 
r2 = f2(a, B) 
print np.allclose(r1, r2) 
:

%timeit f1(a, B) 
%timeit f2(a, B) 

결과는 다음과 같습니다

1000 loops, best of 3: 1.34 ms per loop 
10000 loops, best of 3: 135 µs per loop 
+0

array() 호출을 제거했을 때 3 배 빨라져서 감사합니다. 배열 ([무엇이든])은 배열을 복사하거나 배열이 아닌보기 만 생성하고, empty()는 배열을 할당합니다. –

0

방법 약 :

def f3(a, B): 
    r = np.dot(a, B) 
    return np.rollaxis(r, 1)