Как работает вызов C или C ++ из python?

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]