Должен ли я определить свою функцию Cython, используя def, cdef или cpdef для оптимальной производительности?
Как я могу узнать, использовать ли def, cdef или cpdef при определении функции Cython, при условии, что я хочу оптимальной производительности?
1 ответ
Если вы хотите оптимальной производительности, вы должны знать, что, как упоминалось в этом ответе на связанный вопрос:
Как только функция была вызвана, нет никакой разницы в скорости, что код внутри
cdef
иdef
Функция работает в.
Так что для оптимальной производительности Cython вы всегда должны статически вводить все аргументы и переменные, и тогда вы будете интуитивно склонны использовать cdef
, но есть некоторые предостережения, для которых я построил блок-схему ниже (также на основе ранее упомянутого ответа):
Кроме того, обратите внимание, что:
cpdef
функции заставляют Cython генерироватьcdef
функция (которая позволяет быстрый вызов функции из Cython) иdef
функция (которая позволяет вызывать ее из Python). В целомdef
функция просто вызываетcdef
функция.
... и из документации по Cython:
Это использует раннее связывание, так что
cpdef
функции могут быть максимально быстрыми при использовании основных типов C (используяcdef
).cpdef
функции используют динамическое связывание при передаче объектов Python, и это может быть намного медленнее, возможно, медленнее, чемdef
объявленные функции.
В документации по Cython также имеется тест для конкретного случая (часто вызывающий функцию и из Python), который дает следующий результат: