Должен ли я определить свою функцию Cython с помощью def, cdef или cpdef для оптимальной производительности?

63
5

Как я могу узнать, следует ли использовать def, cdef или cpdef при определении Cython, предполагая, что мне нужна оптимальная производительность?

спросил(а) 2021-01-19T15:55:24+03:00 6 месяцев, 1 неделя назад
1
Решение
90

Если вам нужна оптимальная производительность, вы должны знать, что, как упоминалось в этом ответе, связанный с этим вопрос:


Как только функция была вызвана, нет разницы в скорости, в которой работает код внутри функции cdef и def.



Итак, для оптимальной производительности Cython вы должны всегда статически вводить все аргументы и переменные, и в интуитивном случае у вас возникнет соблазн использовать cdef, но есть некоторые предостережения, для которых я построил блок-схему ниже (также на основе ранее упомянутого ответа):


def, cdef, cpdef flowchart


Кроме того, обратите внимание, что:

Функции

cpdef заставляют Cython генерировать функцию cdef (которая позволяет быстро вызвать функцию из Cython) и функцию def (что позволяет вам называть ее с Python). В обратном направлении функция def просто вызывает функцию cdef.



... и из документации Cython:


Это использует раннее связывание, так что функции cpdef могут быть как можно быстрее при использовании C основных типов (используя cdef). cpdef функции используют динамическое связывание при передаче объектов Python, и это может быть намного медленнее, возможно, так же медленно, как def объявленные функции.



В документации Cython существует также case-specific benchmark (часто вызывающий функцию и от Python), что дает следующий результат:


введите описание изображения здесь

ответил(а) 2021-01-19T15:55:24+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема