Какие существуют варианты взаимодействия C (или C ++) с Python? - PullRequest
14 голосов
/ 05 июля 2011

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

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

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

Ответы [ 2 ]

8 голосов
/ 06 июля 2011

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

Python C API: для написания кода 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 / C ++.Вы должны получить модуль python, который вы можете импортировать и использовать.

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

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

4 голосов
/ 06 июля 2011

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

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

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

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

...