Today I tested how fast is jit from numba python and fibonacci math function.
You will see strange output I got for some values.
First example:
import numba
from numba import jit
from timeit import default_timer as timer
def fibonacci(n):
a, b = 1, 1
for i in range(n):
a, b = a+b, a
return a
fibonacci_jit = jit(fibonacci)
start = timer()
fibonacci(100)
duration = timer() - start
startnext = timer()
fibonacci_jit(100)
durationnext = timer() - startnext
print(duration, durationnext)
The result of this run is:
C:\Python27>python numba_test_003.py
(0.00018731270733896962, 0.167499256682878)
C:\Python27>python numba_test_003.py
(1.6357787798437412e-05, 0.1683614083221368)
C:\Python27>python numba_test_003.py
(2.245186560569841e-05, 0.1758382003097716)
C:\Python27>python numba_test_003.py
(2.3093347480146938e-05, 0.16714964906130353)
C:\Python27>python numba_test_003.py
(1.5395564986764625e-05, 0.17471143739730277)
C:\Python27>python numba_test_003.py
(1.5074824049540363e-05, 0.1847134227837042)
As you can see the fibonacci function is not very fast.
The jit - just-in-time compile is very fast.
Let's see if the python source code may slow down.
Let's see the new source code with jit will not work well:
import numba
from numba import jit
from timeit import default_timer as timer
def fibonacci(n):
a, b = 1, 1
for i in range(n):
a, b = a+b, a
return a
fibonacci_jit = jit(fibonacci)
start = timer()
print fibonacci(100)
duration = timer() - start
startnext = timer()
print fibonacci_jit(100)
durationnext = timer() - startnext
print(duration, durationnext)
The result is this:
C:\Python27>python numba_test_003.py
927372692193078999176
1445263496
(0.0002334994022992635, 0.17628787910376)
C:\Python27>python numba_test_003.py
927372692193078999176
1445263496
(0.0006886307922204926, 0.17579169287387408)
C:\Python27>python numba_test_003.py
927372692193078999176
1445263496
(0.0008105123483657127, 0.18209553525407973)
C:\Python27>python numba_test_003.py
927372692193078999176
1445263496
(0.00025466830415606486, 0.17186550306131188)
C:\Python27>python numba_test_003.py
927372692193078999176
1445263496
(0.0007348174871807866, 0.17523103771560608)
The result for value
100 is not the same:
927372692193078999176 and
1445263496.
The first problem is:
The problem is that numba can't intuit the type of lookup. If you put a print nb.typeof(lookup) in your method, you'll see that numba is treating it as an object, which is slow.
The second problem is the output but can be from the same reason.
I test with value 5 and the result is :
C:\Python27>python numba_test_003.py
13
13
13
13
(0.0007258367409385072, 0.17057997338491704)
C:\Python27>python numba_test_003.py
13
13
(0.00033709872502270044, 0.17213235952108247)
C:\Python27>python numba_test_003.py
13
13
(0.0004836773333341886, 0.17184433415945508)
C:\Python27>python numba_test_003.py
13
13
(0.0006854233828482501, 0.17381272129120037)