Подтвердить что ты не робот

Каковы различные варианты взаимодействия C (или С++) с Python?

Я знаю, что существует много способов взаимодействия функции C с Python: API Python C, scipy.weave, ctypes, pyrex/cython, SWIG, Boost.Python, Psyco... Для чего лучше всего? Почему я должен использовать данный метод вместо других? Что следует учитывать, когда мне нужно выбрать привязку между Python и C?

Я знаю некоторые дискуссии об этом, но все они кажутся неполными...

Я знаю, что некоторые вопросы о StackOverflow тоже связаны. Например:

4b9b3361

Ответ 1

Я не использовал все эти методы, хотя я изучил их все в какой-то момент...

API Python C: для написания кода C, который компилируется в модуль python, который может быть импортирован в Python. Или для написания модуля Python, который действует как "клей" для взаимодействия с некоторой библиотекой C.

scipy.weave. Позволяет вам бить биты кода C в ваш код на Python, если вы используете NumPy и SciPy для выполнения числовой работы, посмотрите на это. Код C был бы как строка, например weave.inline('printf ( "% s", foo) ").

ctypes: модуль python, который позволяет вам вызывать код C из вашего кода на Python. Вы в основном импортируете общую библиотеку, а затем вызываете ее в свой API. Некоторая работа, необходимая для сортировки данных в этих вызовах и из них. Если вы смотрите на существующую библиотеку C, которую вы или кто-то другой писали, я бы начал здесь.

pyrex/cython. Позволяет писать код Python (используя специальный синтаксис), который будет сгенерирован в C-код (который может быть импортирован как модуль Python) и, очевидно, работает быстрее, чем если он был запущен через интерпретатор Python. Это похоже на маршрут "Python C API", только он генерирует для вас код C. Полезно, если у вас есть кусок кода, который является вашим узким местом и очень медленный. Перепишите эту функцию с помощью cython и импортируйте ее из вызывающего кода.

SWIG. Создает код оболочки для библиотеки C/С++. Вы должны использовать модуль python, который вы можете импортировать и использовать.

Boost.Python. Это тот, о котором я знаю меньше всего. Мне кажется, что он похож на SWIG, хотя вы сами пишете слой обертки, но с большой помощью от макросов/функций Boost.

Psyco: немного ускоряет ваш код на Python, мне никогда не удавалось с этим справиться. Я бы не стал тратить время на это. Профилируйте свой код, найдите свои узкие места и ускорьте их, используя один из вышеуказанных методов.

Ответ 2

Это лишь краткий ответ на часть вашего вопроса, но:

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

API Python C лучше всего, когда вы либо хотите что-то написать в C, который использует аспекты Python, или хотите написать расширение для Python в C. (Cython - это еще один способ сделать это.)

Конечно, оба из них, скорее всего, более подробно описаны в некоторых ответах на вопросы SO, на которые вы ссылаетесь в своем вопросе.