Расширение 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 будет медленнее, но, возможно, не значительно.
Лучше всего было бы собрать образец вашего кода, написанный по-любому, и сравнить его. В противном случае имеется слишком много переменных для окончательного ответа.