Suche…


Bemerkungen

Was ist Cython?

Die Programmiersprache Cython bereichert Python durch C-artige statische Typisierung, die Möglichkeit, C-Funktionen direkt aufzurufen, und viele andere Funktionen. Dadurch kann die Leistung auf C-Ebene erreicht werden, während eine Python-artige Syntax verwendet wird.

Wie funktioniert es?

Cython-Code wird mit dem Cython-Quelle-zu-Quelle-Compiler kompiliert, um C- oder C ++ - Code zu erstellen, der wiederum mit einem C-Compiler kompiliert werden kann. Dies ermöglicht das Erstellen von Erweiterungen, die von Python oder ausführbaren Dateien importiert werden können.

Der Hauptleistungsgewinn, den Cython im Gegensatz zu reinem Python erzielen kann, ergibt sich aus der Umgehung der CPython-API. Wenn Sie zum Beispiel zwei Ganzzahlen hinzufügen, führt Python eine Typüberprüfung für jede Variable durch, sucht eine Add-Funktion, die die gefundenen Typen erfüllt, und ruft diese Funktion auf. Im durch Cython generierten C-Code sind die Typen bereits bekannt und es wird nur ein Funktionsaufruf an durchgeführt. Daher ist Cython besonders für mathematische Probleme geeignet, bei denen die Typen klar sind.

Wie kann ich meinen Code beschleunigen?

Ein häufiger Anwendungsfall beim Versuch, ein Programm mit Cython zu beschleunigen, besteht darin, den Code zu profilieren und die rechenintensiven Teile in kompilierte Cython-Module zu verschieben. Dadurch kann die Python-Syntax für den Großteil des Codes beibehalten und die Beschleunigung dort angewendet werden, wo sie am dringendsten benötigt wird.

Cython installieren

Für die Verwendung von Cython sind zwei Dinge erforderlich. Das Cython-Paket selbst, das den cython Source-to-Source-Compiler und die Cython-Schnittstellen zu mehreren C- und Python-Bibliotheken enthält (z. B. numpy). Zum Kompilieren des vom cython Compiler generierten C-Codes wird ein C-Compiler benötigt.

Schritt 1: Cython installieren

Systemagnostiker

Cython kann mit mehreren systemunabhängigen Paketverwaltungssystemen installiert werden. Diese schließen ein:

  1. PyPI via pip oder easy_install:

    $ pip install cython
    $ easy_install cython
    
  2. Anakonda mit Conda:

    $ conda install cython
    
  3. Überdachte Canopy mit dem enpkg-Paketmanager:

    $ enpkg cython
    

Der Quellcode kann auch von github heruntergeladen und manuell installiert werden:

$ python setup.py install

Ubuntu, Debian

Für Ubuntu die Pakete cython und cython3 stehen zur Verfügung. Beachten Sie, dass diese Versionen eine ältere Version als die oben genannten Installationsoptionen bieten.

$ apt-get install cython cython3

Windows

Für Windows wird eine .whl-Datei , die mit pip installiert werden kann, von einem Drittanbieter bereitgestellt. Details zum Installieren einer .whl-Datei unter Windows finden Sie hier .


Schritt 2: Installation eines C-Compilers

Zum Kompilieren der von Cython generierten C-Dateien ist ein Compiler für C und C ++ erforderlich. Der gcc-Compiler wird empfohlen und kann wie folgt installiert werden.

Ubuntu, Debian

Das build-essential Paket enthält alles, was benötigt wird. Es kann aus den Repositorys installiert werden mit:

$ sudo apt-get install build-essential

MAC

Die XCode-Entwicklerwerkzeuge enthalten einen gcc-ähnlichen Compiler.

Windows

MinGW (Minimalist GNU for Windows) enthält eine Windows-Version von gcc. Der Compiler von Visual Studio kann ebenfalls verwendet werden.

Hallo Welt

Eine Cython Pyx-Datei muss in C-Code übersetzt ( cythonisiert ) und kompiliert werden, bevor sie von Python verwendet werden kann. Ein gängiger Ansatz ist das Erstellen eines Erweiterungsmoduls, das dann in ein Python-Programm importiert wird.

Code

Für dieses Beispiel erstellen wir drei Dateien:

  • hello.pyx enthält den Cython-Code.
  • test.py ist ein Python-Skript, das die Hallo-Erweiterung verwendet.
  • setup.py wird zum Kompilieren des Cython-Codes verwendet.

hallo.pyx

from libc.math cimport pow

cdef double square_and_add (double x):
    """Compute x^2 + x as double.

    This is a cdef function that can be called from within
    a Cython program, but not from Python.
    """
    return pow(x, 2.0) + x

cpdef print_result (double x):
    """This is a cpdef function that can be called from Python."""
    print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))

test.py

# Import the extension module hello.
import hello

# Call the print_result method 
hello.print_result(23.0)

setup.py

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

# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))

Kompilieren

Dazu können Sie den Code mit cython hello.pyx nach C übersetzen und dann mit gcc kompilieren. Ein einfacher Weg ist es, Distutils damit umgehen zu lassen:

$ ls
hello.pyx  setup.py  test.py
$ python setup.py build_ext --inplace
$ ls
build  hello.c  hello.cpython-34m.so  hello.pyx  setup.py  test.py

Die Shared Object-Datei (.so) kann aus Python importiert und verwendet werden, sodass wir jetzt die test.py :

$ python test.py
(23.0 ^ 2) + 23.0 = 552.0 


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow