Por que o Cython é muito mais lento que o Numba quando itera sobre matrizes NumPy?

Ao iterar sobre matrizes NumPy, o Numba parece dramaticamente mais rápido que o Cytho
Quais otimizações do Cython estão faltando?

Aqui está um exemplo simples:

ódigo Python @Pure:
import numpy as np

def f(arr):
  res=np.zeros(len(arr))

  for i in range(len(arr)):
     res[i]=(arr[i])**2

  return res

arr=np.random.rand(10000)
%timeit f(arr)

out: 4.81 ms ± 72.2 µs por loop (média ± desvio padrão de 7 corridas, 100 loops cad

ódigo @Cython (no Jupyter):
%load_ext cython
%%cython

import numpy as np
cimport numpy as np
cimport cython
from libc.math cimport pow

#@cython.boundscheck(False)
#@cython.wraparound(False)

cpdef f(double[:] arr):
   cdef np.ndarray[dtype=np.double_t, ndim=1] res
   res=np.zeros(len(arr),dtype=np.double)
   cdef double[:] res_view=res
   cdef int i

   for i in range(len(arr)):
      res_view[i]=pow(arr[i],2)

   return res

arr=np.random.rand(10000)
%timeit f(arr)

Out: 445 µs ± 5,49 µs por loop (média ± desvio padrão de 7 execuções, 1000 loops cad

Numba code:
import numpy as np
import numba as nb

@nb.jit(nb.float64[:](nb.float64[:]))
def   f(arr):
   res=np.zeros(len(arr))

   for i in range(len(arr)):
       res[i]=(arr[i])**2

   return res

arr=np.random.rand(10000)
%timeit f(arr)

Out: 9,59 µs ± 98,8 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)

Neste exemplo, o Numba é quase 50 vezes mais rápido que o Cytho
Sendo um iniciante em Cython, acho que estou perdendo alguma cois

Claro, neste caso simples, usando o NumPysquare função vetorizada teria sido muito mais adequad

%timeit np.square(arr)

Out: 5,75 µs ± 78,9 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cad

questionAnswers(1)

yourAnswerToTheQuestion