On a simple thing:
%load_ext mypyc_ipython
def py_fibonacci(n: int) -> int:
if n <= 1+1:
return 1
else:
return py_fibonacci(n-1) + py_fibonacci(n-2)
%%mypyc
def my_fibonacci(n: int) -> int:
if n <= 2:
return 1
else:
return my_fibonacci(n-1) + my_fibonacci(n-2)
%load_ext cython
%%cython
cpdef int cy_fibonacci(int n):
if n <= 2:
return 1
else:
return cy_fibonacci(n-1) + cy_fibonacci(n-2)
%timeit py_fibonacci(30)
101 ms ± 503 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit my_fibonacci(30)
8.55 ms ± 248 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit cy_fibonacci(30)
2.35 ms ± 75.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)