2009-09-11 3 views
1

В настоящее время я пишу привязки python для библиотеки C++, над которой я работаю. Библиотека читает формат двоичного файла, и скорость чтения очень важна. Оптимизируя библиотеку для скорости, я заметил, что std :: vector (используется в экземплярах, которые я читаю), заедал много времени обработки, поэтому я заменил их на простые массивы, выделенные новым [] (будь то это хорошая/мудрая вещь, чтобы сделать, это еще один вопрос).Возвращение массива C++ (указатель) из boost python

Теперь я застрял в проблеме того, как предоставить доступ к этим массивам python. Кажется, нет никакого решения, встроенного в boost :: python (я не смог найти хотя бы один).

Пример кода, чтобы проиллюстрировать ситуацию:

// Instance.cpp 
class Instance 
{ 
    int * data; 
    int dataLength; 
    Instance() 
    { 
     data = new int[10]; 
     dataLength = 10; 
    } 
}; 

// Class pythonBindings.cpp 
BOOST_PYTHON_MODULE(db) 
{ 
    class_<Instance>("Instance", init<>()) 
     .add_property("data", ........) 
    ; 
} 

Я предполагаю, что я мог бы использовать функцию-оболочку, которая строит повышающий :: питона :: список из массивов, когда питон хочет получить к ним доступ. Поскольку я совершенно новичок в boost :: python, я решил, что должен спросить, есть ли какие-нибудь хорошие стандартные или встроенные решения этой проблемы, прежде чем я начну взламывать.

Итак, как бы вы порекомендовали обертывание Instancedata массив с использованием boost :: python?

+0

Вектор не должен быть заметен медленнее, чем массив, если вы дадите ему подсказку размера. Вы уверены, что включили оптимизатор? (Это легко сделать.) –

+0

Хорошая точка, проверяя мои первоначальные версии. Я замечаю, что я не указывал начальный размер и вместо этого использовал push_back. Я посмотрю, как быстро он работает с использованием std :: vector. Благодаря! –

+1

Оказалось, что изменение в стилевых массивах c было преждевременным: использование std :: vector оказалось таким же быстрым, если вы соответствующим образом используете оптимизацию reserve() и компилятора. (Не уверен, что это должен быть комментарий или ответ на мой вопрос) –

ответ

1

Я буду рекомендовать данные об обертке и dataLength с прокси-классом и возвращает из экземпляра этот прокси-сервер. В нашем проекте мы используем этот способ для экспорта данных из нашего приложения в python.

Если вы хотите, я могу дать вам несколько ссылок на нашу реализацию и объяснить, как это работает.

4

Если вы измените свой класс для работы с std::vector случаями, взгляните на свите вектора индексации (http://www.boost.org/doc/libs/1_41_0/libs/python/doc/v2/indexing.html), что позволяет подвергать векторы питону с родным интерфейсом списка, без создания копий с/на питон.

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