Вызовите np.sqrt в cython - PullRequest
       9

Вызовите np.sqrt в cython

0 голосов
/ 08 ноября 2018
%%cython
import numpy as np
cimport numpy as np

def cy_sum(int n):
    cdef double s=0
    cdef int i 
    for i in range(n):
        s += np.sqrt(i)
    return s

cython -a

У меня есть код для вычисления суммы квадратного корня, как указано выше. Используя cython -a, я получил результат, как на картинке. Код cython взаимодействует с python при вызове функции np.sqrt(i), и улучшения по сравнению с чистым кодом python нет.

Я не знаю, сделал ли я что-то неправильно, указав тип переменных. Существуют и другие решения, такие как использование i**(1/2) или импорт функции sqrt из clib, но я хотел бы понять, почему Cython не может скомпилировать np.sqrt в этом случае.

Спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

В общем, когда Cython видит вызов функции python, он обрабатывается как непрозрачная операция. Cython может исключить некоторые накладные расходы на вызовы, но в противном случае он будет генерировать точно такую ​​же семантику, как если бы эта функция была вызвана из python.

Некоторые numpy-конструкции, такие как тип ndarray[dtype], специально компилируются компилятором Cython для генерации более эффективного кода. numpy ufuncs - нет, поэтому для cython np.sqrt это просто еще одна функция python, поэтому она не может сделать ничего лучше, чем вызвать обратно Python для ее запуска.

Другие ускорители Python, такие как numba, будут перехватывать вызов np.sqrt и переписывать его в эквивалентный код низкого уровня.

...