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

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

1 ответ

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

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

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

блок-схема def, cdef, cpdef

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

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

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

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

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

Другие вопросы по тегам