3
\$\begingroup\$

I thought this community is better place to ask my question so I ask here rather than at StackOverflow. Recently, I learned that Numba can make Python function which uses numpy modules and for loops super faster so I was trying to implement it to my code in order to optimize execution time. However, ironically, using it made the code execution time much slower. Following codes show the comparison between 1) code using Numba and 2) original code.

Also, I use 2 data as an input (numpy.ndarray) with names n and e which are both float32 arrays of length 201. You can test my code with these data.

n=np.array([0.00000000e+00,  -2.90246233e-02,  -2.24490568e-01,
        -7.16749728e-01,  -1.57171035e+00,  -2.77444601e+00,
        -4.22764540e+00,  -5.76536274e+00,  -7.17996216e+00,
        -8.25780201e+00,  -9.09192276e+00,  -9.90472031e+00,
        -1.06955252e+01,  -1.14638758e+01,  -1.22095718e+01,
        -1.29326763e+01,  -1.36334448e+01,  -1.43122253e+01,
        -1.49694138e+01,  -1.56054220e+01,  -1.62206211e+01,
        -1.68152523e+01,  -1.73894081e+01,  -1.79430256e+01,
        -1.84757977e+01,  -1.89870377e+01,  -1.94757748e+01,
        -1.99407864e+01,  -2.03805809e+01,  -2.07932720e+01,
        -2.11767120e+01,  -2.15285759e+01,  -2.18464222e+01,
        -2.21277046e+01,  -2.23698120e+01,  -2.25701656e+01,
        -2.27262192e+01,  -2.28354397e+01,  -2.28954563e+01,
        -2.29041901e+01,  -2.28599644e+01,  -2.27614594e+01,
        -2.26076698e+01,  -2.23979702e+01,  -2.21322174e+01,
        -2.18107166e+01,  -2.14341793e+01,  -2.10038280e+01,
        -2.05215683e+01,  -1.99899464e+01,  -1.94121590e+01,
        -1.87920952e+01,  -1.81344280e+01,  -1.74445496e+01,
        -1.67284374e+01,  -1.59926023e+01,  -1.52440386e+01,
        -1.44902058e+01,  -1.37389374e+01,  -1.29982576e+01,
        -1.22761898e+01,  -1.15806122e+01,  -1.09191751e+01,
        -1.02992201e+01,  -9.72764969e+00,  -9.21087074e+00,
        -8.75471401e+00,  -8.36433029e+00,  -8.04401970e+00,
        -7.79723310e+00,  -7.62662983e+00,  -7.53405952e+00,
        -7.52038527e+00,  -7.58545780e+00,  -7.72822046e+00,
        -7.94686508e+00,  -8.23878956e+00,  -8.60053539e+00,
        -9.02776337e+00,  -9.51539421e+00,  -1.00577345e+01,
        -1.06485300e+01,  -1.12809696e+01,  -1.19478493e+01,
        -1.26417017e+01,  -1.33548985e+01,  -1.40797272e+01,
        -1.48085299e+01,  -1.55338354e+01,  -1.62484665e+01,
        -1.69456844e+01,  -1.76192360e+01,  -1.82633667e+01,
        -1.88728962e+01,  -1.94433289e+01,  -1.99709244e+01,
        -2.04526272e+01,  -2.08860626e+01,  -2.12695827e+01,
        -2.16023121e+01,  -2.18841362e+01,  -2.21156521e+01,
        -2.22980556e+01,  -2.24331856e+01,  -2.25235310e+01,
        -2.25722427e+01,  -2.25830765e+01,  -2.25602932e+01,
        -2.25085907e+01,  -2.24330215e+01,  -2.23388729e+01,
        -2.22315712e+01,  -2.21166210e+01,  -2.19994831e+01,
        -2.18853989e+01,  -2.17793064e+01,  -2.16857681e+01,
        -2.16088982e+01,  -2.15522213e+01,  -2.15185966e+01,
        -2.15101852e+01,  -2.15284405e+01,  -2.15740509e+01,
        -2.16469669e+01,  -2.17463741e+01,  -2.18707085e+01,
        -2.20176525e+01,  -2.21841602e+01,  -2.23664932e+01,
        -2.25603275e+01,  -2.27608757e+01,  -2.29629631e+01,
        -2.31610470e+01,  -2.33492279e+01,  -2.35214043e+01,
        -2.36715298e+01,  -2.37937660e+01,  -2.38824825e+01,
        -2.39323406e+01,  -2.39385643e+01,  -2.38971081e+01,
        -2.38046494e+01,  -2.36585808e+01,  -2.34572048e+01,
        -2.31998024e+01,  -2.28866425e+01,  -2.25189037e+01,
        -2.20986404e+01,  -2.16287670e+01,  -2.11129856e+01,
        -2.05556641e+01,  -1.99617062e+01,  -1.93365269e+01,
        -1.86859131e+01,  -1.80159054e+01,  -1.73325996e+01,
        -1.66420517e+01,  -1.59501858e+01,  -1.52626762e+01,
        -1.45847788e+01,  -1.39213161e+01,  -1.32765999e+01,
        -1.26543894e+01,  -1.20577383e+01,  -1.14889488e+01,
        -1.09496098e+01,  -1.04407034e+01,  -9.96269608e+00,
        -9.51548195e+00,  -9.09836483e+00,  -8.71012592e+00,
        -8.34911537e+00,  -8.01335907e+00,  -7.70055103e+00,
        -7.40815973e+00,  -7.13349152e+00,  -6.87368536e+00,
        -6.62575817e+00,  -6.38672686e+00,  -6.15366173e+00,
        -5.92375469e+00,  -5.69433641e+00,  -5.46290398e+00,
        -5.22722960e+00,  -4.98536777e+00,  -4.73564768e+00,
        -4.47674179e+00,  -4.20764303e+00,  -3.92769504e+00,
        -3.63661599e+00,  -3.33451986e+00,  -3.02191830e+00,
        -2.61823845e+00,  -2.09174943e+00,  -1.52332258e+00,
        -9.90778685e-01,  -5.54975927e-01,  -2.49610826e-01,
        -7.68868327e-02,  -9.74494778e-03,   0.00000000e+00], dtype=float32)

e=np.array([0.00000000e+00,  -2.39476264e-02,  -1.95374981e-01,
        -6.55762613e-01,  -1.50696099e+00,  -2.77968431e+00,
        -4.41394567e+00,  -6.25681400e+00,  -8.07964897e+00,
        -9.61341381e+00,  -1.09259253e+01,  -1.22610502e+01,
        -1.36115866e+01,  -1.49705763e+01,  -1.63314114e+01,
        -1.76879139e+01,  -1.90344372e+01,  -2.03657932e+01,
        -2.16773891e+01,  -2.29651966e+01,  -2.42257977e+01,
        -2.54562702e+01,  -2.66542950e+01,  -2.78181095e+01,
        -2.89464245e+01,  -3.00384007e+01,  -3.10936413e+01,
        -3.21121521e+01,  -3.30942726e+01,  -3.40405350e+01,
        -3.49516640e+01,  -3.58286057e+01,  -3.66724052e+01,
        -3.74841537e+01,  -3.82649269e+01,  -3.90158615e+01,
        -3.97381325e+01,  -4.04328537e+01,  -4.11011162e+01,
        -4.17439575e+01,  -4.23624077e+01,  -4.29573746e+01,
        -4.35296898e+01,  -4.40801773e+01,  -4.46096611e+01,
        -4.51190338e+01,  -4.56091652e+01,  -4.60809402e+01,
        -4.65354042e+01,  -4.69738083e+01,  -4.73974800e+01,
        -4.78078232e+01,  -4.82064171e+01,  -4.85949020e+01,
        -4.89749336e+01,  -4.93481598e+01,  -4.97163124e+01,
        -5.00811615e+01,  -5.04445229e+01,  -5.08082886e+01,
        -5.11744041e+01,  -5.15448380e+01,  -5.19215736e+01,
        -5.23065796e+01,  -5.27017555e+01,  -5.31089096e+01,
        -5.35298271e+01,  -5.39661331e+01,  -5.44192924e+01,
        -5.48905334e+01,  -5.53807945e+01,  -5.58906784e+01,
        -5.64204826e+01,  -5.69702682e+01,  -5.75397987e+01,
        -5.81285400e+01,  -5.87356644e+01,  -5.93601112e+01,
        -6.00004807e+01,  -6.06552086e+01,  -6.13225784e+01,
        -6.20007973e+01,  -6.26880646e+01,  -6.33824730e+01,
        -6.40822220e+01,  -6.47855148e+01,  -6.54907074e+01,
        -6.61962433e+01,  -6.69004745e+01,  -6.76018448e+01,
        -6.82988281e+01,  -6.89898987e+01,  -6.96735458e+01,
        -7.03481979e+01,  -7.10121918e+01,  -7.16639557e+01,
        -7.23019028e+01,  -7.29244461e+01,  -7.35300446e+01,
        -7.41171265e+01,  -7.46841965e+01,  -7.52298584e+01,
        -7.57526855e+01,  -7.62513962e+01,  -7.67248459e+01,
        -7.71719666e+01,  -7.75918121e+01,  -7.79834213e+01,
        -7.83460007e+01,  -7.86789093e+01,  -7.89816742e+01,
        -7.92538223e+01,  -7.94950333e+01,  -7.97050018e+01,
        -7.98835449e+01,  -8.00305862e+01,  -8.01461563e+01,
        -8.02304077e+01,  -8.02836456e+01,  -8.03062363e+01,
        -8.02987900e+01,  -8.02619324e+01,  -8.01963196e+01,
        -8.01027451e+01,  -7.99821243e+01,  -7.98353271e+01,
        -7.96633453e+01,  -7.94671249e+01,  -7.92478104e+01,
        -7.90065460e+01,  -7.87445374e+01,  -7.84630661e+01,
        -7.81635818e+01,  -7.78474579e+01,  -7.75161743e+01,
        -7.71711807e+01,  -7.68137894e+01,  -7.64451599e+01,
        -7.60662384e+01,  -7.56776810e+01,  -7.52800369e+01,
        -7.48734894e+01,  -7.44580231e+01,  -7.40333176e+01,
        -7.35989304e+01,  -7.31542664e+01,  -7.26986237e+01,
        -7.22311020e+01,  -7.17508316e+01,  -7.12570038e+01,
        -7.07489014e+01,  -7.02259598e+01,  -6.96877289e+01,
        -6.91337738e+01,  -6.85638351e+01,  -6.79777908e+01,
        -6.73756409e+01,  -6.67574463e+01,  -6.61231613e+01,
        -6.54727097e+01,  -6.48059692e+01,  -6.41226959e+01,
        -6.34223747e+01,  -6.27042465e+01,  -6.19672279e+01,
        -6.12100372e+01,  -6.04309807e+01,  -5.96278610e+01,
        -5.87980995e+01,  -5.79385986e+01,  -5.70459251e+01,
        -5.61163254e+01,  -5.51455879e+01,  -5.41292572e+01,
        -5.30626335e+01,  -5.19408646e+01,  -5.07591400e+01,
        -4.95127220e+01,  -4.81970291e+01,  -4.68076973e+01,
        -4.53407593e+01,  -4.37926598e+01,  -4.21605453e+01,
        -4.04422188e+01,  -3.86362457e+01,  -3.67420464e+01,
        -3.47598801e+01,  -3.26910439e+01,  -3.05377808e+01,
        -2.83032646e+01,  -2.59916306e+01,  -2.36078224e+01,
        -2.05195694e+01,  -1.64658623e+01,  -1.20626736e+01,
        -7.90684271e+00,  -4.47298717e+00,  -2.03672314e+00,
        -6.36906505e-01,  -8.22197124e-02,   0.00000000e+00], dtype=float32)

##########################################################################

# import libraries
import numpy as np
from numba import jit
import time

Original code

I define 2 functions (rotate_ne_rt and Grid_Search) which take n and e as inputs.

def rotate_ne_rt(n, e, ba):
    if len(n) != len(e):
        raise TypeError("North and East component have different length.")
    if ba < 0 or ba > 360:
        raise ValueError("Back Azimuth should be between 0 and 360 degrees.")
    ba = np.radians(ba)
    r = - e * np.sin(ba) - n * np.cos(ba)
    t = - e * np.cos(ba) + n * np.sin(ba)
    return r, t

def Grid_Search(n, e):
    energy_1=[]
    for angle in np.arange(0, 360, 1):
        r, t=rotate_ne_rt(n, e, ba=angle)
        average_energy=np.mean(t**2) # Average transverse energy to be minimized 
        energy_1.append(average_energy)

    best_angle=np.argmin(np.array(energy_1))
    
    return best_angle

Following script shows the time spent in execution.

start=time.time()
print(Grid_Search(n, e))
end=time.time()
print("Elapsed (after compilation) = %s" % (end - start))

no numba

Code using Numba

I define 2 functions (rotate_ne_rt and Grid_Search) which take n and e as inputs.

@jit(nopython=True)
def rotate_ne_rt(n, e, ba):
    if len(n) != len(e):
        raise TypeError("North and East component have different length.")
    if ba < 0 or ba > 360:
        raise ValueError("Back Azimuth should be between 0 and 360 degrees.")
    ba = np.radians(ba)
    r = - e * np.sin(ba) - n * np.cos(ba)
    t = - e * np.cos(ba) + n * np.sin(ba)
    return r, t

@jit(nopython=True)
def Grid_Search(n, e):
    energy_1=[]
    for angle in np.arange(0, 360, 1):
        r, t=rotate_ne_rt(n, e, ba=angle)
        average_energy=np.mean(t**2) # Average transverse energy to be minimized 
        energy_1.append(average_energy)

    best_angle=np.argmin(np.array(energy_1))
    
    return best_angle

Following script shows the time spent in execution.

start=time.time()
print(Grid_Search(n, e))
end=time.time()
print("Elapsed (after compilation) = %s" % (end - start))

with numba

As you can see, execution is almost 60 times slower when using numba which is undesirable. What am I misunderstanding about numba for this case and is there a way to efficiently use numba to make my code much faster than not using it?

\$\endgroup\$
3

1 Answer 1

1
\$\begingroup\$

Actually, it is embarrassing to answer my question, but I think the problem was about the initial compilation time using numba. After I executed function Grid_Search once and executed it again, it outperforms original code in terms of execution time.

fixed

If you have other suggestions to make execution time faster, please tell me.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ It's not embarassing to answer your own question, it happens :) However, I think that in the future this is the kind of test you should run before posting you question ahah \$\endgroup\$
    – IEatBagels
    Commented May 20, 2021 at 15:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.