Extension de Python par C ou C ++ (lorsqu'il y a plusieurs arguments, lors du passage d'une liste du côté Python)

Je l'ai fait moi-même pendant un moment, alors prends note

Il a été utilisé lors de l'exécution d'un algorithme génétique. Je me sens mieux. .. .. En prime, j'ai fait une simple conversion décimale-binaire et une conversion de code gris. Il est facile d'utiliser des chaînes de bits, mais avec le sens de la pratique.

Tout d'abord, le code C (partie). Le retrait est cassé, mais j'ai écrit le même processus plusieurs fois, mais les règles de dénomination sont aléatoires, mais comme point de départ. C'est un peu long, mais c'est pareil.

Au fait, j'ai passé la liste du côté Python et l'ai reçue du côté C. Le programme est difficile ...

Référence (principalement liée à l'API) http://stackoverflow.com/questions/5079570/writing-a-python-c-extension-how-to-correctly-load-a-pylistobject

http://rokujyouhitoma.hatenablog.com/entry/20100704/1278216557

http://www.hexacosa.net/documents/python-extending/

Référence (calcul de bits, etc.) http://saeki-ce.xsrv.jp/index.html

Autre wiki etc.

cbinary.c


#include <Python.h>

#define LOWER_BOUND    0
#define UPPER_BOUND    1000
#define MAX_BIT_LENGTH 10

int binaryToValue(int *);

static PyObject *
valueToGray(PyObject *self, PyObject *args)
{
  //return gray code
  int i, n, m, len;
  unsigned int num;
  int b[MAX_BIT_LENGTH];
  PyListObject *binary;
  binary = (PyListObject *) PyList_New(MAX_BIT_LENGTH);

  if (!PyArg_ParseTuple(args, "i", &num)){
    return NULL;
  }
  n = (num >> 1) ^ num; //Convertir en code gris

  //Convertir en binaire
  for (i=0; n>0; i++){
    m=n%2;   //Divisé par 2
    n=n/2;  //Diviser par 2
    b[i] = m;
  }

  len = i; //Longueur lors de la conversion en binaire d'un entier

  //Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
  for (i=len; i<MAX_BIT_LENGTH; i++ ){
    b[i] = 0;
  }
 
  //Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
  n = 0;
  for (i=MAX_BIT_LENGTH-1; i>=0; i--){
  //Mettre une valeur de type int en gris un bit à la fois
    PyList_SET_ITEM(binary, n++, Py_BuildValue("i", b[i]));
  }

  return Py_BuildValue("O", binary);
}


static PyObject *
make_individual(PyObject *self, PyObject *args)
{

  int b[MAX_BIT_LENGTH];
  int m,n,i,len;
  unsigned int min, max;
  unsigned int random_int;
  unsigned int gray_int;

  PyListObject *gray; //Représenter un objet de liste python
  gray = (PyListObject *) PyList_New(MAX_BIT_LENGTH); //La taille est MAX~Faire une liste de

  if (!PyArg_ParseTuple(args, "ii", &min, &max)){ //Lorsqu'il y a plusieurs arguments, écrivez-les côte à côte comme ii
    return NULL;
  }

  if (min < LOWER_BOUND){
    exit(0);
  }
  else if (max > UPPER_BOUND){
    exit(0);
  }
  //Générer des nombres entiers aléatoirement
  random_int = min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
  gray_int = (random_int >> 1) ^ random_int; //Convertir en code gris

  n = gray_int;
  //Convertir en binaire
  for (i=0; n>0; i++){
    m=n%2;   //Divisé par 2
    n=n/2;  //Diviser par 2
    b[i] = m;
  }

  len = i; //Longueur lors de la conversion en binaire d'un entier

  //Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
  for (i=len; i<MAX_BIT_LENGTH; i++ ){
    b[i] = 0;
  }
 
  //Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
  n = 0;
  for (i=MAX_BIT_LENGTH-1; i>=0; i--){
  //Mettre une valeur de type int en gris un bit à la fois
    PyList_SET_ITEM(gray, n++, Py_BuildValue("i", b[i]));
  }

  return Py_BuildValue("O", gray);
}

static PyObject *
grayToBinary(PyObject *self, PyObject *args)
{

  unsigned int num;
  unsigned int mask;
  int m,n,i,len;
  int b[MAX_BIT_LENGTH], inputed_binary[MAX_BIT_LENGTH];
  PyListObject *binary; //Représenter un objet de liste python
  PyObject *get_list;
  binary = (PyListObject *) PyList_New(MAX_BIT_LENGTH); 

  if (!PyArg_ParseTuple(args, "O", &get_list )){
    return NULL;
  }
  if PyList_Check(get_list) {
      for (i=0; i<PyList_Size(get_list); i++){
	//Extraire le contenu de l'objet liste lors de sa conversion pour qu'il soit visible en C?(Pas de confiance)
	inputed_binary[i] = PyInt_AsSsize_t(PyList_GetItem(get_list, (Py_ssize_t)i)); //ok
      }
    }
  
  num = binaryToValue(inputed_binary);
  
  for (mask = num >> 1; mask != 0; mask = mask >> 1){
    //Annuler du code gris
    num = num ^ mask;
  }
  
  n = num;
  //Convertir en binaire
  for (i=0; n>0; i++){
    m=n%2;   //Divisé par 2
    n=n/2;  //Diviser par 2
    b[i] = m;
  }

  len = i; //Longueur lors de la conversion en binaire d'un entier

  //Ajoutez 0 à l'épée pour qu'elle devienne 10 bits
  for (i=len; i<MAX_BIT_LENGTH; i++ ){
    b[i] = 0;
  }
  
  //Copiez la chaîne de bits qui était dans l'ordre inverse dans l'ordre binaire
  n = 0;
  for (i=MAX_BIT_LENGTH-1; i>=0; i--){
    //Entrez une valeur de type int en binaire un bit à la fois
    PyList_SET_ITEM(binary, n++, Py_BuildValue("i", b[i]));
  }

  return Py_BuildValue("O", binary);
}


int binaryToValue(int *b){
  //Convertir le binaire en entier
  int i,n;
  i=0; n=0;

  while(i < MAX_BIT_LENGTH){
    if (b[i] == 1) n+=1;
    i+=1;
    if (i == MAX_BIT_LENGTH) break;
    n=n*2;
    //printf("%d\n", n);
  }
  return n;
}

static PyObject *
binaryToPtype(PyObject *self, PyObject *args)
{

  int i,n;
  int inputed_binary[MAX_BIT_LENGTH];
  PyListObject *binary; //Représenter un objet de liste python
  PyObject *get_list;

  if (!PyArg_ParseTuple(args, "O", &get_list )){ //Passez l'objet python tel quel
    return NULL;
  }
  
  if PyList_Check(get_list) {
      for (i=0; i<PyList_Size(get_list); i++){
	inputed_binary[i] = PyInt_AsSsize_t(PyList_GetItem(get_list, (Py_ssize_t)i)); //ok
      }
    }
  
  i=0; n=0;

  while(i < MAX_BIT_LENGTH){
    if (inputed_binary[i] == 1) n+=1;
    i+=1;
    if (i == MAX_BIT_LENGTH) break;
    n=n*2;
    //printf("%d\n", n);
  }
  return Py_BuildValue("i", n);
}


static PyObject *
hello(PyObject *self)
{
    printf("Hello World!!\n");
    Py_RETURN_NONE;
}

static char ext_doc[] = "C extention module example\n";

static PyMethodDef methods[] = {
  {"hello", (PyCFunction)hello, METH_NOARGS, "print hello world.\n"},
  {"value_to_gray", valueToGray, METH_VARARGS, "return gray obj.\n"},
  {"make_individual", make_individual, METH_VARARGS, "return gray code.\n"},
  {"gray_to_binary", grayToBinary, METH_VARARGS, "return binary code.\n"},
  {"binary_to_ptype", binaryToPtype, METH_VARARGS, "return ptype value.\n"},
  {NULL, NULL, 0, NULL}
};

void initcbinarymethods(void)
{
    Py_InitModule3("cbinarymethods", methods, ext_doc);
}

Comme d'habitude, écrivez setup.py.

setup.py


from distutils.core import setup, Extension

module1 = Extension('cbinarymethods',
                    sources = ['cbinary.c'])

setup (name = 'cbinarymethods',
       version = '1.0',
       description = 'This is a demo package',
       ext_modules = [module1])

Encore une fois, construisez sur la ligne de commande comme d'habitude.

$ python setup.py build_ext --inplace #--Ajouter en place pour le rendre actuel.Il semble que cela puisse être fait

Si vous pouvez le construire avec succès, vous aurez cbinarymethods.so.

Importons-le avec python et utilisons-le

>>> import cbinarymethods as cbm
>>> i = cbm.make_individual(200, 250)
>>> i
[0, 0, 1, 0, 0, 0, 1, 0, 1, 1]
>>> a = cbm.gray_to_binary([0,0,1,0,1,0,0,1,0,1])
>>> a
[0, 0, 1, 1, 0, 0, 0, 1, 1, 0]

Recommended Posts

Extension de Python par C ou C ++ (lorsqu'il y a plusieurs arguments, lors du passage d'une liste du côté Python)
Points Python du point de vue d'un programmeur en langage C
[Python] Afficher uniquement les éléments de la liste côte à côte [Vertical, horizontal]
Passer la liste de Python vers C ++ par référence dans pybind11
Comment écrire une chaîne de caractères lorsqu'il y a plusieurs lignes en python
Copiez la liste en Python
[Python] Solution au problème que les éléments sont liés lors de la copie d'une liste
Tutoriel "Cython" qui rend Python explosif: Gérer le passage de fonctions côté C ++ par référence.
Trier la liste des tuples en Python en spécifiant l'ordre croissant / décroissant de plusieurs clés
Regrouper par éléments consécutifs d'une liste en Python
Il y a deux interprétations de a = b = c dans VBScript
Une bibliothèque qui surveille la vie et la mort d'autres machines en envoyant un ping à partir de Python
Python> Obtenir une liste de fichiers dans plusieurs répertoires> Utiliser glob | Trier par heure de modification
__init__ appelé par wxPython ou Tkinter était un appel __init__ de la classe héritée en Python
Lorsque j'ai créé un scan ECR à partir d'un CDK, je pouvais voir l'arrière du scan
Pas étonnamment connu! ?? Qu'en est-il des arguments de fonction intégrés? De quelle école êtes-vous? [Python]
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Différent du type d'importation de python. Signification de depuis A import B
Ajouter une liste de fonctions de bibliothèque numpy petit à petit --c
Obtenez le nombre d'éléments spécifiques dans la liste python
Points à noter lors de la suppression de plusieurs éléments de la liste
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Extraire la valeur de dict ou list sous forme de chaîne de caractères
Extraire la valeur la plus proche d'une valeur à partir d'un élément de liste en Python
Tutoriel "Cython" pour rendre Python explosif: Lorsqu'une fonction côté C ++ a une surcharge.
[Python] Un programme qui compare chaque élément de la liste un par un et gagne ou perd. Zip *: français ()
[Python] Comment utiliser l'instruction for. Une méthode d'extraction en spécifiant une plage ou des conditions.
python Remarque: déterminez si l'argument de ligne de commande est dans la liste
Format lors du passage d'une longue chaîne comme argument de python
Précautions lors de l'utilisation d'une liste ou d'un dictionnaire comme argument par défaut
Lire la sortie standard d'un sous-processus ligne par ligne en Python
[Python] Obtenir la date de mise à jour d'un article d'actualité à partir de HTML
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
Liste des dépêches en cas de catastrophe du service d'incendie de la ville de Sapporo [Python]
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Existence du point de vue de Python
python / Créer un dict à partir d'une liste.
À propos de la liste de base des bases de Python
[Explication AtCoder] Contrôlez les problèmes A, B, C d'ABC182 avec Python!
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[Mémo Python] Soyez prudent lors de la création d'un tableau à deux dimensions (liste de listes)
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Comment bien formater une liste de dictionnaires (ou d'instances) en Python
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
[Explication AtCoder] Contrôle ABC184 Problèmes A, B, C avec Python!
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.