J'écris actuellement des bindings python pour une bibliothèque C++ sur laquelle je travaille. La bibliothèque lit un format de fichier binaire et la vitesse de lecture est très importante. Tout en optimisant la librairie pour la vitesse, j'ai remarqué que std :: vector (utilisé dans les instances que je suis en train de lire) prenait beaucoup de temps de traitement, donc je les ai remplacés par des tableaux simples alloués avec new [] (si c'était un bonne/sage chose à faire est une autre question probablement).Retour d'un tableau C++ (pointeur) de boost python
Maintenant, je suis bloqué avec le problème de comment donner un accès python à ces tableaux. Il ne semble pas y avoir de solution intégrée dans boost :: python (je n'ai pas pu en trouver au moins).
code exemple pour illustrer la situation:
// 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", ........)
;
}
Je suppose que je pourrais utiliser une fonction wrapper qui construit un coup de pouce :: python :: liste sur des tableaux à chaque fois que python veut y accéder. Comme je suis assez nouveau pour boost :: python, j'ai pensé que je devrais demander s'il existe des solutions sympas, standard ou intégrées à ce problème avant de commencer à pirater. Alors, comment recommanderiez-vous d'encapsuler le tableau Instance
de data
en utilisant boost :: python?
Le vecteur ne devrait pas être visible plus lentement que le tableau si vous lui donnez un indice de taille. Etes-vous sûr d'avoir activé l'optimiseur? (C'est une erreur facile à faire.) –
Bon point, tout en inspectant mes versions initiales, je remarque que je ne spécifiais pas la taille initiale et que j'utilisais push_back à la place. Je vais voir à quelle vitesse ça marche avec std :: vector correctement. Merci! –
Il s'est avéré que le passage à des tableaux de style c était prématuré: l'utilisation de std :: vector se révélait tout aussi rapide à condition que vous utilisiez les optimisations de reserve() et de compilateur de manière appropriée. (Je ne sais pas si cela devrait être un commentaire ou une réponse à ma propre question) –