Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)

Passez un tableau de flottants de Python et retournez la somme et la moyenne dans un taple.

capi.py


import myModule as capi
import random
x=[random.uniform(0, 100) for x in range(100)]
s=0.0
for a in x:
    s=s+a
print("c ",s,s/len(x))
a=capi.fsum_avr(x)
print("py",a)

Quand tu cours
>python capi.py
py 5025.24247203747 50.252424720374705
c  (5025.24247203747, 50.252424720374705)

capilib.c


#include <Python.h>
static PyObject* fsum_avr(PyObject* self, PyObject* args)
{
    long n;
    double sum=0.0,avr,a;
    PyObject* c_list, *item;
    if (!PyArg_ParseTuple(args, "O", &c_list)) return NULL;   
    // Check list
    if PyList_Check(c_list) n = PyList_Size(c_list);
    else return NULL;
    for (int i = 0; i < n; i++){
        item = PyList_GetItem(c_list, i);
        a = PyFloat_AsDouble(item); // Increment the reference count
        sum = sum + a;
        Py_DECREF(item); // Decrement the reference count
    }
    avr=sum/n;
    return Py_BuildValue("(dd)",sum,avr);
}
static PyMethodDef myMethods[] = {
    { "fsum_avr",fsum_avr, METH_VARARGS, "sum avr"},
    { NULL }
};
static struct PyModuleDef myModule = {
    PyModuleDef_HEAD_INIT,"myModule","C API Module",-1,myMethods
};
PyMODINIT_FUNC PyInit_myModule(void){
    return PyModule_Create(&myModule);
}

** Point d'attention **

  1. PyArg_ParseTuple (args, "O", & c_list) définit l'adresse du tableau de liste sur & c_list par "O". O (object) [PyObject *] Store a Python object (without any conversion) in a C object pointer. The C program thus receives the actual object that was passed. The object's reference count is not increased. The pointer stored is not NULL.
  2. return Py_BuildValue ("(dd)", sum, avr); renvoie le total et la moyenne en tapple.

Voir le lien pour ** Interprétation et valeur de l'argument **.

setup.py


from distutils.core import setup, Extension
setup(name = 'myModule', version = '1.0.0',  \
   ext_modules = [Extension('myModule', ['capilib.c'])])

** Création d'une bibliothèque **

capi>python setup.py install

Recommended Posts

Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Langage C pour voir et se souvenir de la partie 2 Appeler le langage C à partir de la chaîne Python (argument)
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
Appeler le langage C depuis Python (python.h)
Appeler des fonctions du langage C depuis Python pour échanger des tableaux multidimensionnels
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Appelez Matlab depuis Python pour optimiser
Appeler C depuis Python avec DragonFFI
Python pour passer d'une autre langue
Appeler C / C ++ depuis Python sur Mac
[Python] Hit Keras depuis TensorFlow et TensorFlow depuis c ++ pour accélérer l'exécution.
Appelez votre propre bibliothèque partagée en langage C à partir de Python à l'aide de ctypes
[Il n'est pas trop tard pour apprendre Python à partir de 2020] Partie 3 Python Language Basic (1)
De Python à l'utilisation de MeCab (et CaboCha)
Portage et modification du solveur de doublets de python2 vers python3.
Communication socket par langage C et Python
Générer un langage C à partir d'une expression S avec Python
Essayez de porter le programme «Programmation informatique numérique FORTRAN77» vers C et Python (partie 1)
Comment générer une séquence en Python et C ++
Créer un tableau C à partir d'une feuille Python> Excel
Écriture de journaux dans un fichier CSV (Python, langage C)
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 3)
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Partie des classes d'habillage ➀
Essayez de porter le programme "FORTRAN77 Numerical Computing Programming" vers C et Python (partie 2)
Appelez Rust de Python pour accélérer! Tutoriel PyO3: partie des classes d'emballage ➁
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Liste de code Python à déplacer et à mémoriser
Je veux créer du code C ++ à partir de code Python!
Un moyen simple d'appeler Java depuis Python
L'histoire du portage du code de C vers Go (et vers la spécification du langage)
Passez un tableau de PHP à PYTHON et effectuez un traitement numpy pour obtenir le résultat
Essayez de créer un module Python en langage C
Changements de Python 2 à Python 3.0
Introduction au langage Python
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple
Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple ➁
[Introduction à cx_Oracle] (Partie 6) Mappage des types de données DB et Python
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Apprenez les bases et les astuces des expressions canoniques Python à partir de zéro
J'ai essayé d'illustrer le temps et le temps du langage C
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)
Flirter de PHP à Python
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Passer de python2.7 à python3.6 (centos7)
Connectez-vous à sqlite depuis python
Porté du langage R de "Sazae-san's Janken Data Analysis" vers Python
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie1-
[First Ripple] [I am] Appeler JavaScript (Node.js) depuis Python et traiter Ripple
Introduction à l'API Socket apprise en langage C, partie 1, édition serveur
Installez mecab sur le serveur partagé Sakura et appelez-le depuis python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Résolution de l'introduction d'AOJ aux algorithmes et aux structures de données en Python -Partie2-
[Langage C] Comment créer, éviter et créer un processus zombie