import time def fib(n: int) -> int: if n == 1 or n == 0: return 1 return fib(n - 1) + fib(n - 2) t0 = time.time() fib(35) t1 = time.time() print(f"{(t1 - t0) \* 1000} ms")
~> mypyc fib.py
~> python >>> import fib 332.64994621276855 ms
Numba wins and is about twice as fast as my most clever Cython code. Naive Cython is pretty bad, but more clever Cython is reasonably good (though not as good as numba).
I don't know that cpython would take advantage of mypy annotations and you can make a cpython program not python-compatible, but you don't have to.