Aus "Python durch Fusion mit Cython C beschleunigen" O'Reilly Ich habe versucht, unter Ubuntu zu verfolgen, dass eine in C geschriebene Funktion in Python importiert und ausgeführt werden kann.
Das Beispiel dieses Buches befindet sich zunächst auf Github. Laden Sie es daher als Zip-Datei herunter. https://github.com/cythonbook/examples
Wechseln Sie in das extrahierte Verzeichnis. examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random
Hier gibt es ein Makefile, also versuche es zu machen. Dann scheinen die notwendigen Dateien erstellt worden zu sein Das Beispiel auf Seite 128 desselben Buches funktioniert mit IPython. In [1]: import mt_random
In [2]: mt_random.init_state(42)
In [3]: mt_random.rand() Out[3]: 0.37454011439684315
Natürlich können Sie C-Funktionen in Cython wie im Buch beschrieben umschließen.
Erstens gibt es eine C-Quelldatei und eine Header-Datei.
mt.pxd
cdef extern from "mt19937ar.h":
void init_genrand(unsigned long s)
double genrand_real1()
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()
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]))
Und das Makefile, auf dem setup.py ausgeführt wird, war bereits in der Zip-Datei enthalten. Wenn Sie dies tun, erhalten Sie das Ergebnis der vorherigen Ausführung.
Ich fand, dass ich es umschließen kann, indem ich pxd-Datei, pyx-Datei, setup.py schreibe.
Über das auf diese Weise implementierte Modul mt_random help(mt_random) Dann Es ist auch praktisch, die unten gezeigte Hilfe zu sehen.
Help on module mt_random: NAME mt_random
FILE / (Ausgelassen) /examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random/mt_random.so
FUNCTIONS init_state(...)
rand(...)
DATA test = {}
Um mehr als dieses Beispiel zu verstehen, scheint es Kapitel 7 desselben Buches zu lesen.
Auch wenn Sie nicht alles in C schreiben, schreiben Sie nur den Engpass in C. Ich bin froh, dass das Schreiben eines Wrappers mit Cython ausreicht.
Recommended Posts