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