Чтобы получить быстрое деление на cython, я могу использовать директиву компилятора
@cython.cdivision(True)
Это работает, потому что полученный c-код не имеет проверки нулевого деления. Однако по какой-то причине он фактически замедляет мой код. Вот пример:
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
@cython.cdivision(True)
def example1(double[:] xi, double[:] a, double[:] b, int D):
cdef int k
cdef double[:] x = np.zeros(D)
for k in range(D):
x[k] = (xi[k] - a[k]) / (b[k] - a[k])
return x
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def example2(double[:] xi, double[:] a, double[:] b, int D):
cdef int k
cdef double[:] x = np.zeros(D)
for k in range(D):
x[k] = (xi[k] - a[k]) / (b[k] - a[k])
return x
def test_division(self):
D = 10000
x = np.random.rand(D)
a = np.zeros(D)
b = np.random.rand(D) + 1
tic = time.time()
example1(x, a, b, D)
toc = time.time()
print 'With c division: ' + str(toc - tic)
tic = time.time()
example2(x, a, b, D)
toc = time.time()
print 'Without c division: ' + str(toc - tic)
Это приводит к выводу:
With c division: 0.000194787979126
Without c division: 0.000176906585693
Есть ли причина, по которой выключение проверки нулевого деления может замедлить работу (я знаю, что нет делителей нуля).