Envelopper C avec Cython pour une utilisation à partir de Python

Depuis "Accélérer Python en fusionnant avec Cython C" O'Reilly J'ai essayé de tracer sur Ubuntu qu'une fonction écrite en langage C peut être importée et exécutée en Python.

Tout d'abord, l'exemple de ce livre est sur github, alors téléchargez-le sous forme de fichier zip. https://github.com/cythonbook/examples

Accédez au répertoire extrait. examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random

Il y a un Makefile ici, alors essayez de le créer. Ensuite, il semble que les fichiers nécessaires ont été créés L'exemple p128 du même livre fonctionne à partir d'IPython. In [1]: import mt_random

In [2]: mt_random.init_state(42)

In [3]: mt_random.rand() Out[3]: 0.37454011439684315

Bien sûr, vous pouvez encapsuler les fonctions C en Cython comme décrit dans le livre.

Tout d'abord, il y a un fichier source C et un fichier d'en-tête.

Déclaration de code C externe en Cython (extension .pxd)

mt.pxd


cdef extern from "mt19937ar.h":
    void init_genrand(unsigned long s)
    double genrand_real1()

Fonction C wrap (extension .pyx)

mt_random.pyx


# distutils: sources=["mt19937ar.c"]
cimport mt

def init_state(unsigned long s):
    mt.init_genrand(s)

def rand():
    return mt.genrand_real1()

Fichier Setup.py qui vous indique comment compiler

setup.py


from distutils.core import setup, Extension
from Cython.Build import cythonize

ext = Extension("mt_random",
                sources=["mt_random.pyx", "mt19937ar.c"])

setup(name="mersenne_random",
      ext_modules = cythonize([ext]))

Et le Makefile qui exécute setup.py était déjà inclus dans le fichier zip. Si vous faites cela, vous obtiendrez le résultat de l'exécution précédente.

J'ai trouvé que je pouvais l'envelopper en écrivant un fichier pxd, un fichier pyx, setup.py.

A propos du module mt_random implémenté de cette manière help(mt_random) Puis Il est également pratique d'afficher l'aide comme indiqué ci-dessous.

Help on module mt_random: NAME mt_random

FILE / (Omis) /examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random/mt_random.so

FUNCTIONS init_state(...)

rand(...)

DATA test = {}

Pour comprendre plus que cet exemple, il semble lire le chapitre 7 du même livre.

Même si vous n'écrivez pas tout en C, écrivez uniquement le goulot d'étranglement en C Je suis heureux que l'écriture d'un wrapper en utilisant Cython soit suffisante.

Recommended Posts

Envelopper C avec Cython pour une utilisation à partir de Python
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Utilisation des fonctions C ++ de python avec pybind11
Appeler C depuis Python avec DragonFFI
Conseils pour appeler Python à partir de C
Utiliser DeepL avec python (pour la traduction d'articles)
Objet de tampon de tableau pouvant être utilisé avec Cython
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
Utilisez Thingsspeak de Python
[Python] Utiliser JSON avec Python
Utiliser fluentd de python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Utilisez MySQL depuis Python
Utilisez Logger avec Python pour le moment
Utiliser mecab avec Python 3
Utiliser DynamoDB avec Python
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ① ~
Utilisez Python 3.8 avec Anaconda
Utiliser python avec docker
Utiliser MySQL depuis Python
Utilisez BigQuery depuis Python.
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ② ~
Utilisez mecab-ipadic-neologd de Python
Benchmarks langage C, Java, Python avec factorisation prime
Utiliser Python installé par pyenv pour l'environnement d'exécution PL / Python
Programmez avec votre smartphone n'importe où! (Recommandé pour le langage C / Python)
Utiliser l'API Trello avec python
Utiliser TUN / TAP avec Python
Utiliser Cython avec Jupyter Notebook
Utiliser l'API subsonique avec python3
Avec skype, notifiez avec skype de python!
Utilisez l'API e-Stat de Python
Utilisons un langage de script pour une implémentation C ++ confortable après vérification avec python
Utiliser IvyFEM (bibliothèque de méthodes d'éléments finis pour .NET) à partir de Python
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
Obtenez des données de l'API d'analyse avec le client API Google pour python
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -
Résoudre ABC163 A ~ C avec Python
Python: comment utiliser async avec
Utiliser la PNL Stanford Core à partir de Python
Utiliser la caméra Point Grey avec Python (PyCapture2)
Utilisez vl53l0x avec RaspberryPi (python)
Utilisation de Rstan de Python avec PypeR
Installez Python à partir des sources avec Ansible
Appeler popcount depuis Ruby / Python / C #
Premiers pas avec Python pour les classes PHPer
Utilisez NAIF SPICE TOOL KIT avec Python
Lire et utiliser des fichiers Python à partir de Python
Ensuite, utilisez Python (Flask) pour Heroku!
Utiliser de force Google Translate à partir de python
Aide-mémoire Python (pour les expérimentés C ++)
Utiliser rospy avec virtualenv dans Python3
Résoudre ABC168 A ~ C avec Python