Скорость выполнения функции cython vs ctypes

У меня есть простой план для моей программы: выполнить весь входной синтаксический анализ и предварительную обработку данных с помощью Python, а затем передать множество структур и вызвать ОДИН РАЗ функцию обработки чисел, которую я собираюсь написать на C. Вот мой вопрос: что будет быстрее (с точки зрения скорости выполнения)? Вызвать функцию C с помощью ctypes или написать ее с помощью cython?


person user1673833    schedule 17.12.2013    source источник
comment
Использование Cython и ctypes для вызова одной функции C за один раз существенно не отличается. Более интересно, если вы напишете функцию на Cython, добавив ровно столько статической типизации, чтобы она работала хорошо. Это может быть не так быстро, но версия на Cython более удобочитаема, чем C, и ее легче поддерживать.   -  person Eryk Sun    schedule 18.12.2013
comment
Это также будет зависеть от точного кода, который вы хотите вызвать. У меня, например, проблемы с тем, что cython не работает быстрее, чем мой python (думаю, мне нужно выучить больше трюков), поэтому я склонен просто использовать ctypes для таких вещей. Однако для большого класса проблем обычные операции с векторами numpy выполняются почти так же быстро, как использование cython или ctypes, поэтому сначала посмотрите там, как это проще всего.   -  person Brian Larsen    schedule 19.12.2013


Ответы (1)


Учитывая бесконечное количество времени для оптимизации вашего кода, Ctypes, вероятно, будут быстрее, поскольку вы сможете втиснуть как можно больше тяжелой работы в скомпилированный код.

cython берет код, похожий на python, и преобразует его в код C с множеством предостережений и исключений. Если бы cython был идеальным, он был бы таким же быстрым, как кодирование в C-API для python. cython — фантастический инструмент для быстрой разработки кода, но он еще не совсем совершенен.

Ctypes потребуют некоторых манипуляций с вашими входными переменными, чтобы аккуратно передать их в C. Это может не быть проблемой, если вы все равно выполняете предварительную обработку данных.

Как обычно, вам нужно решить, насколько важна скорость выполнения по сравнению со временем кодирования/читаемостью кода/возможностью повторного использования кода. Мне показалось бы странным, что меня интересует только скорость выполнения, и при этом вы хотите кодировать что-либо из этого на python.

И наоборот, общие парадигмы кодирования на Python будут иметь тенденцию контрастировать с большими разделами кода C, удерживаемыми вместе с помощью оболочек Python.

person Community    schedule 01.12.2015