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 ++.
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 ++.
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.
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 */
};
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 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')
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.
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;
}
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';
}
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)
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