ctypes vs C extension - PullRequest
       14

ctypes vs C extension

18 голосов
/ 09 ноября 2011

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

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


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

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

Ответы [ 2 ]

14 голосов
/ 09 ноября 2011

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

7 голосов
/ 09 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...