В настоящее время я пишу привязки 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, я решил, что должен спросить, есть ли какие-нибудь хорошие стандартные или встроенные решения этой проблемы, прежде чем я начну взламывать.
Итак, как бы вы порекомендовали обертывание Instance
data
массив с использованием boost :: python?
Вектор не должен быть заметен медленнее, чем массив, если вы дадите ему подсказку размера. Вы уверены, что включили оптимизатор? (Это легко сделать.) –
Хорошая точка, проверяя мои первоначальные версии. Я замечаю, что я не указывал начальный размер и вместо этого использовал push_back. Я посмотрю, как быстро он работает с использованием std :: vector. Благодаря! –
Оказалось, что изменение в стилевых массивах c было преждевременным: использование std :: vector оказалось таким же быстрым, если вы соответствующим образом используете оптимизацию reserve() и компилятора. (Не уверен, что это должен быть комментарий или ответ на мой вопрос) –