Возврат массива (указателя) c ++ из наддува Python - PullRequest
1 голос
/ 11 сентября 2009

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

Теперь я застрял с проблемой, как предоставить 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 :: list из массивов всякий раз, когда python хочет получить к ним доступ. Поскольку я совсем новичок в boost :: python, я решил спросить, есть ли какие-нибудь хорошие, стандартные или встроенные решения этой проблемы, прежде чем я начну взламывать.

Итак, как бы вы порекомендовали обернуть массив Instance data с помощью boost :: python?

Ответы [ 2 ]

4 голосов
/ 22 января 2010

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

1 голос
/ 11 декабря 2009

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

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

...