Наконец-то вопрос, на который я действительно могу дать положительный ответ :).
Я исследовал f2py, boost.python, swig, cython и pyrex для моей работы (доктор философии по методам оптических измерений). Я широко использовал swig, boost.python, pyrex и cython. Я также использовал ctypes. Это моя разбивка:
Отказ от ответственности : Это мой личный опыт. Я не связан ни с одним из этих проектов.
SWIG:
не очень хорошо играет с с ++. Должно быть, но проблемы с именами на этапе компоновки стали для меня большой головной болью в Linux и Mac OS X. Если у вас есть код C и вы хотите, чтобы он был связан с python, это хорошее решение. Я упаковал GTS для своих нужд и мне нужно было написать в основном общую библиотеку C, к которой я мог бы подключиться. Я бы не рекомендовал это.
Ctypes:
Я написал оболочку libdc1394 (библиотека IEEE Camera), используя ctypes, и это был очень простой опыт. Вы можете найти код на https://launchpad.net/pydc1394. Преобразование заголовков в код Python требует много усилий, но тогда все работает надежно. Это хороший способ, если вы хотите подключить внешнюю библиотеку. Ctypes также находится в stdlib Python, поэтому каждый может использовать ваш код прямо сейчас. Это также хороший способ быстро поиграть с новой библиотекой Python. Я могу рекомендовать его для взаимодействия с внешними библиотеками.
Boost.Python : Очень приятно. Если у вас уже есть собственный код C ++, который вы хотите использовать в python, сделайте это. Таким образом, очень легко перевести структуры классов С ++ в структуры классов Python. Я рекомендую это, если у вас есть код C ++, который вам нужен в Python.
Pyrex / Cython: Используйте Cython, а не Pyrex. Период. Cython более продвинутый и более приятный в использовании. В настоящее время я делаю все с Cython, что я делал с SWIG или Ctypes. Это также лучший способ, если у вас есть код Python, который работает слишком медленно. Процесс абсолютно фантастический: вы конвертируете свои модули Python в модули Cython, собираете их и продолжаете профилирование и оптимизацию, как будто это все еще был Python (никаких изменений инструментов не требуется). Затем вы можете применить столько же (или так мало) кода C, смешанного с вашим кодом Python. Это гораздо быстрее, чем переписывать целые части вашего приложения на C; Вы переписываете только внутренний цикл.
Время : ctypes имеет самые высокие издержки вызова (~ 700 нс), за которыми следует boost.python (322 нс), затем непосредственно swig (290 нс). У Cython самая низкая нагрузка на вызов (124 нс) и лучшая обратная связь, на которую он тратит время (поддержка cProfile!). Числа из моего ящика вызывают тривиальную функцию, которая возвращает целое число из интерактивной оболочки; Поэтому накладные расходы на импорт модуля не рассчитаны, а только на вызовы функций. Поэтому проще и эффективнее быстро получить код Python с помощью профилирования и использования Cython.
Резюме : Для вашей проблемы используйте Cython;). Я надеюсь, что это краткое изложение будет полезно для некоторых людей. Я с удовольствием отвечу на любой оставшийся вопрос.
Редактировать : забываю упомянуть: для числовых целей (то есть подключения к NumPy) используйте Cython; у них есть поддержка для этого (потому что они в основном разрабатывают для этого Cython). Так что это должно быть еще один +1 для вашего решения.