Расширение ctypes vs C

У меня есть несколько функций, написанных на C для игрового проекта. Эти функции называются довольно много (около 2000-4000 раз в секунду). Функции записываются на C для необработанной скорости.

Теперь самый простой способ включить эти функции в Python - использовать ctypes. Альтернативой является написать расширение C для Python вокруг этих функций (что требует немалых усилий). Поэтому я подумал, не включая начальную загрузку DLL, насколько велики накладные расходы ctypes?


Я использую Python 2.7 (стандартный выпуск CPython), и я не хочу использовать внешнюю библиотеку, такую ​​как Cython.

Я знаю, что этот вопрос задан раньше, но я не видел много информации о сравнении производительности между двумя параметрами.

Ответы

Ответ 1

Я сравнивал производительность расширения C с оболочкой ctypes. В моем конкретном тесте разница составляла около 250 раз. В библиотеке C было несколько вызовов, поэтому оболочка ctypes также выполняла код Python. Время работы библиотеки C было очень коротким, что сделало дополнительные накладные расходы для кода Python еще более значительными. Таким образом, отношение, вероятно, будет отличаться для вас, но было значительным в моем случае.

Ответ 2

Прямой C-кодированный интерфейс может быть намного быстрее. Узким местом является интерфейс от Python до C и сортировка аргументов, и результаты могут, например, включать в себя копирование строк или преобразование списков Python в/из массивов C. Если у вас есть цикл, который составляет несколько сотен таких вызовов, и некоторые данные не должны сортироваться отдельно для каждого вызова, тогда все, что вам нужно сделать, это перекодировать цикл на C, и вы можете значительно уменьшить узкое место, ctypes не дает вам эту возможность: все, что вы можете сделать, это напрямую вызвать существующие функции.

Конечно, все зависит от того, какие функции вы вызываете и какие данные вы просматриваете. Возможно, вы не можете уменьшить накладные расходы, и в этом случае я бы все же ожидал, что ctypes будет медленнее, но, возможно, не значительно.

Лучше всего было бы собрать образец вашего кода, написанный по-любому, и сравнить его. В противном случае имеется слишком много переменных для окончательного ответа.