2009-09-11 8 views
1

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?

+0

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.) –

+0

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! –

+1

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) –

Répondre

1

Je recommanderai une donnée de retour à la ligne et une longueur de données avec une classe proxy et retournerai de l'instance ce proxy. Dans notre projet, nous utilisons ce moyen pour exporter des données de notre application vers python.

Si vous voulez, je peux vous donner quelques liens vers notre implémentation et expliquer comment cela fonctionne.

Questions connexes