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\$CommentedMay 20, 2021 at 15:18

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.