2010-08-02 4 views
0

Я использую Boost.Python для расширения функций программы python. В сценариях Python много вызовов для собственных модулей, поэтому я действительно обеспокоен производительностью преобразования типа python-to-cpp и маршалингом данных.Расширения Python - производительность

Я решил попробовать разоблачить методы изначально через API Python C. Может быть, кто-то уже пробовал это раньше? Любой успех ... по крайней мере теоретически?

Проблема, с которой я столкнулся, заключается в том, что как преобразовать PyObject * обратно в экземпляр класса, PyArg_parse предоставляет параметр O &, но то, что я ищу, является просто указателем на объект C++ в памяти ... как я могу его получить функция?

if (PyArg_ParseTuple(args, "O", &pyTestClass)) { // how to get TestClass from pyTestClass ?? }

Благодаря

ответ

1

Я не пробовал Boost.Python, но я расширил Python с использованием сырой C, а также Cython. Я рекомендую Cython; если вы достаточно осторожны, вы можете получить код с такой же эффективностью, как и исходный C, но с гораздо меньшим количеством шаблонов.

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

+0

Позволяет принести некоторую абстракцию. У меня есть простая функция: def sum (a, b): return a + b. Давайте теперь представим, что он называется C из сотен тысяч раз, поэтому каждая микросекунда стоит здесь. Очевидно, это просто абстракция, т. Е. Я знаю, что это не имеет смысла. Однако в реальной жизни у меня есть лучший пример. Так что мне нужно здесь, чтобы получить минимальную задержку между вызовами, значит, мне нужно оптимизировать время между вызовами реальной суммы функций, которая делает то, что она должна. Каков наилучший подход в этой ситуации? – Alex

+0

Итак, вы хотите позвонить Python из C? Во всяком случае, накладные расходы в интерфейсе между Python и C в основном связаны с необходимостью вставлять/удалять вещи в объекты (например, в C у вас есть int, в Python у вас есть целое число, которое намного больше) и обрабатывает подсчет ссылок. Это «быстро», но если вызываемая функция очень проста и должна быть вызвана в узком цикле, может быть слишком много накладных расходов. Чтобы получить представление о работе, Cython имеет возможность написать html-файл, который показывает код C, созданный для линии Cython/Python. Это дает вам представление о стоимости каждой операции. – dimatura

Смежные вопросы