[PYTHON] Implémenter une partie du processus en C ++

Les bibliothèques de calcul scientifique telles que NumPy et SciPy ne sont pas seulement riches en fonctionnalités, mais aussi des interprètes. Il fonctionne si vite que vous ne pouvez pas le considérer comme une langue. Cela devrait être le cas, et comme vous pouvez le voir à partir du code source, l'implémentation interne utilise des fonctionnalités mortes écrites dans des langages de compilation tels que C et Fortran.

Parmi les calculs qui sont appelés régulièrement et à plusieurs reprises dans Python et Ruby, il est plus efficace de décrire les calculs à usage général comme des extensions utilisant un langage de compilation tel que C / C ++. Les avantages et inconvénients sont les suivants.

Même si vous utilisez le langage interpréteur ultérieurement dans le cadre du prototypage avant de l'implémenter en C / C ++, vous pourrez peut-être le réutiliser en écrivant la partie bibliothèque en C / C ++.

Ecrire une bibliothèque d'extension Python en C ++

Vous voudrez peut-être lire la documentation officielle pour une explication détaillée.

Extensions Python avec C et C ++ http://docs.python.jp/3.3/extending/extending.html

L'API Python peut être incorporée dans le monde C en incorporant "Python.h". Ceux-ci doivent être appelés avant la bibliothèque standard C / C ++.

argument

static PyObject *
mymethod(PyObject *self, PyObject *args) {
  const char *text;
  if (!PyArg_ParseTuple(args, "s", &text))
    return NULL;
  ...
}

Les fonctions ont toujours deux arguments et sont habituellement traitées comme self et args.

Tableau des méthodes

La table de méthodes de PyMethodDef définit comment accéder à un objet et appeler une méthode depuis Python.

static PyMethodDef SomeMethods[] = {
    ...
    {"module_name",  module_name, METH_VARARGS,
     "Écrivez une description ici"},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

Inscription à la bibliothèque

Le code qui s'initialise lorsque la bibliothèque est appelée pour la première fois est PyMODINIT_FUNC. Assurez-vous que PyModule_Create () est renvoyé.

PyMODINIT_FUNC
PyInit_module_name(void) {
    return PyModule_Create(&module_name);
}

Construire une extension

Construire avec distutils est recommandé.

from distutils.core import setup, Extension
module = Extension('module_name', ['mymodule.cpp'])
setup(name='module_name',
      version='1.0',
      ext_modules=[module],
     )

Le reste peut être utilisé en utilisant setup.py.

python setup.py build
python setup.py install #Lors de l'installation sur le système

Une fois installé, vous pourrez importer à tout moment. Sinon, spécifiez simplement le chemin du fichier .so et importez-le.

import module_name
module_name.some_method('args')

Utilisez C ++

Pour la norme officielle C ++, Lire la norme est recommandée. Alternativement, Le livre de référence C ++ est disponible, afin que vous puissiez vous y référer.

Utiliser Boost

Boost comprend des membres du Comité de normalisation C ++ Avec une bibliothèque gratuite à la main, vous pouvez faire de la programmation moderne à l'aide de modèles. L'exemple suivant utilise boost :: split pour fractionner une chaîne.

#include <boost/algorithm/string.hpp> //Utiliser Boost
#include <boost/foreach.hpp>
#include <string>
#include <list>
#include <iostream>

using namespace std; // std::Apportez à l'espace de noms
int main ()
{
    string str ("192.168.0.1 192.168.0.2");
    list<string> list_string;
    boost::split(list_string, str, boost::is_space()); //Diviser la chaîne avec des espaces

    BOOST_FOREACH(string s, list_string) {
        cout << s << endl;
    }
    return 0;
}

Utilisez C ++ 11

Au moment de la rédaction de cet article, une mise à jour mineure de C ++ 11 C ++ 14 a déjà été [rédigée](https: // github. (com / cplusplus / draft), mais compte tenu de 2014, au moins C ++ 11 ou version ultérieure code conforme Il vaudrait mieux écrire.

Voici un exemple d'utilisation de C ++ 11 std :: array. Le tableau par défaut a moins de fonctionnalités que std :: vector. D'un autre côté, std :: array enveloppe le tableau brut pour qu'il puisse être utilisé comme std :: vector. Puisqu'il s'agit d'un wrapper, il a la particularité que le coût et la vitesse internes sont presque les mêmes que ceux de la baie d'origine.

#include <algorithm>
#include <functional>
#include <array> // std::array
#include <iostream>

int main()
{
    std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; // std::Tableau par tableau

    std::sort(s.begin(), s.end(), std::greater<int>()); //Std pour trier un tableau::Utiliser le tri
    for (int a : s) {
        std::cout << a << " "; //Trier et exporter vers la sortie standard
    }
    std::cout << '\n';
}

Techniques détaillées d'utilisation de C ++

L'alias -s de zsh vous permet d'assigner une fonction à une extension qui vous permet d'utiliser C ++ comme s'il s'agissait d'un langage de script.

function runcpp () { g++ -std=c++11 $1 && shift && ./a.out $@ } # -std=c++C à 11++11 Conforme
alias -s {c,cpp}=runcpp #Attribuer une fonction à l'extension

Après cela, si vous démarrez le code source comme si l'attribut d'exécution était donné comme ./my.cpp, le résultat du traitement sera renvoyé.

Veuillez noter que C ++ 11 est compatible avec g ++ 4.7 et supérieur. Il peut ne pas fonctionner tel quel avec les anciennes distributions de packages telles que CentOS 6. (Pour CentOS 6, il sera Disponible en ajoutant un référentiel)

Résumé

Python est célèbre en tant que langage de collage, mais si vous écrivez la partie importante avec une bibliothèque d'extensions en C ++, vous pouvez également accélérer le goulot d'étranglement. Par exemple, lors de l'implémentation d'une nouvelle bibliothèque de statistiques / d'apprentissage automatique, il peut être plus approprié d'utiliser une bibliothèque d'extensions que de l'écrire de manière native, compte tenu de la vitesse réaliste. La gamme d'applications s'élargira.

Recommended Posts

Implémenter une partie du processus en C ++
Implémenter la solution de l'algèbre de Riccati en Python
Implémenter le processus gaussien dans Pyro
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
L'histoire de la participation à AtCoder
Implémenter le modèle Singleton en Python
Traiter le résultat de% time,% timeit
L'histoire du "trou" dans le fichier
Comment implémenter du code Java en arrière-plan de Red Hat (Linux ONE)
[Comprendre en 3 minutes] Le début de Linux
Vérifiez le comportement du destroyer en Python
Implémenter le filtre FIR en langage Python et C
Le résultat de l'installation de python sur Anaconda
Tri sélect écrit en C
Principes de base pour exécuter NoxPlayer en Python
Comprendre la partie "temporaire" d'UNIX / Linux
À la recherche du FizzBuzz le plus rapide en Python
Définissez le nom du processus du programme Python
Lignes directrices pour se réincarner dans le monde du développement de programmation Linux (langage C / C ++)
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
Essayez d'installer uniquement la partie principale d'Ubuntu
Comment utiliser la bibliothèque C en Python
Sortie du nombre de cœurs de processeur en Python
Signification de {numéro de version} dans le package mysql rpm
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Changer la taille de police de la légende dans df.plot
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Apprentissage de la reconnaissance de formes en vidéo Partie 1 Champ de reconnaissance de formes
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Lire la sortie du sous-processus, ouvrir en temps réel
Découvrez la fraction de la valeur saisie en python
Envoyer Gmail à la fin du processus [Python]
[Python] Lire le code source de Bottle Part 1
Implémenter le modèle mathématique «modèle SIR» des maladies infectieuses dans OpenModelica (voir l'effet du vaccin)
L'histoire de la recherche du n optimal dans N poing
Se débarrasser des images DICOM avec Python Partie 2
Correction des arguments de la fonction utilisée dans map
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Visualisation de l'état d'utilisation de l'évier dans l'entreprise
Sortie sous la forme d'un tableau python
Obtenir uniquement la partie adresse de la carte réseau (eth0)
L'histoire de l'affichage des fichiers multimédias dans Django
Rechercher par la valeur de l'instance dans la liste
Mettre en œuvre REPL
Rendre la progression de dd visible sur la barre de progression
J'ai essayé d'implémenter Human In The Loop - Partie ① Tableau de bord -
[Python + OpenCV] Peignez la partie transparente de l'image en blanc
Lorsqu'un fichier est placé dans le dossier partagé de Raspberry Pi, le processus est exécuté.
Comment afficher la date de modification d'un fichier en langage C jusqu'à nanosecondes