2015-12-15 5 views
2

Существует несколько вопросов о том, как «как» вызывать код C C++ из Python. Но я хотел бы понять, что именно происходит, когда это делается, и что касается производительности. Какова теория внизу? Некоторые вопросы, на которые я надеюсь получить ответ, понимают принцип:Как работает вызов C или C++ из python?

При рассмотрении обрабатываемых данных (особенно больших данных) (например, 2 ГБ), которые необходимо передать с питона на C/C++, а затем обратно. Как передаются данные с python на C при вызове функции? Как результат передается после завершения функции? Все ли выполнено в памяти или UNIX/TCP сокеты или файлы, используемые для передачи данных? Есть ли какой-либо перевод и копирование (например, для преобразования типов данных), мне нужна память объемом 2 ГБ для хранения данных на python и дополнительной памяти + -2 ГБ, чтобы иметь C-версию данных, переданных функции C? Выполняют ли код C и код Python в разных процессах?

+0

2 ГБ данных для передачи. Файлы могут быть лучшим вариантом. – Pawan

+1

Зависит от того, как именно вы это делаете. Потенциально данные могут совместно использоваться в одном процессе без копирования, если вы используете модуль ctypes Python для вызова кода C/C++ в общей библиотеке или DLL. Вы также можете встроить интерпретатор Python в свое приложение C/C++ и поделиться им с помощью модуля расширения Python. Или вы можете сделать это, как вы описали с отдельными процессами и сокетами, если хотите. –

ответ

2

Вы можете звонить между C, C++, Python и связью других языков, не создавая отдельный процесс или не копируя что-либо.

В Python в основном все подсчитывается по ссылке, поэтому, если вы хотите использовать объект Python на C++, вы можете просто использовать один и тот же счетчик ссылок для управления его временем жизни (например, чтобы избежать копирования, даже если Python решает, что он не нужен объект больше). Если вы хотите обратное, вам может потребоваться использовать C++ std::shared_ptr или аналогично держать ваши объекты на C++, чтобы Python также мог ссылаться на них.

В некоторых случаях это даже проще, например, если у вас есть чистая функция на C или C++, которая принимает некоторые значения из Python и возвращает результат без побочных эффектов и без хранения входов. В таком случае вам, разумеется, не нужно ничего копировать, потому что вы можете напрямую считывать значения Python и интерпретатор Python не будет работать, пока выполняется ваш C или C++-код (потому что все они находятся в одном потоке).

Существует обширный Python (и NumPy, кстати) C API для этого, плюс отличная Boost.Python для интеграции на C++, включая интеллектуальные указатели.

+0

Я думал, что данные Python находятся в другом формате, и C не может работать с ним напрямую. Или питон использует одни и те же типы данных? Является ли C прямым доступом к адресам памяти, где python сохраняет данные и может читать данные без какого-либо перевода? Интересно, каким образом называется API C. Единственный способ, которым я называл API-интерфейсы между разными языками раньше, - использовать Http. – Marcel

+1

Возможно, стоит добавить, что «по умолчанию» Python, CPython, реализован в C. Из-за этого на самом деле не существует другого языка. Библиотеки, такие как 'numpy' или те, которые создаются' Boost.Python', просто соединяются с Python на уровне C с самого начала. Проверьте, например. https://docs.python.org/2/extending/extending.html для основ. – sebastian

+1

Наиболее популярные реализации Python в первую очередь записываются * в C, поэтому, конечно, C может использовать структуры данных Python. Существуют API-интерфейсы C для работы с типами данных Python, такими как list и dict. Например, если вы получаете указатель на C в список из Python, вы можете использовать API C, описанный здесь: https://docs.python.org/2/c-api/list.html –