Frage

Ich kam gerade über Cython, während ich nach Möglichkeiten zur Optimierung des Python-Code schauen. Ich lese verschiedene Beiträge auf Stackoverflow, das Python-Wiki und lesen Sie den Artikel „Allgemeine Regeln für die Optimierung“.

Cython ist etwas, das mein Interesse ergreift die meisten; stattdessen C-Code für sich selbst zu schreiben, können Sie andere Datentypen in Ihrem Python-Code haben, sich selbst.

Hier ist ein dummer Test habe ich versucht,

#!/usr/bin/python
# test.pyx
def test(value):
    for i in xrange(value):
    i**2
    if(i==1000000):
        print i

test(10000001)

$ time Python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$ time cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

Nun, ehrlich gesagt, i`m sprachlos. Der Code, die ich verwendet habe hier ist reiner Python-Code, und alles, was ich geändert habe, ist der Dolmetscher. In diesem Fall, wenn cython dies gut ist, dann warum verwenden die Menschen immer noch den traditionellen Python interpretor? Gibt es Probleme mit der Zuverlässigkeit für Cython?

War es hilfreich?

Lösung

Die anderen Antworten haben bereits erklärt, wie Sie den Code Cython nur wurden Kompilieren, Ausführen es nicht. Ich dachte aber, dass Sie vielleicht wollen wissen, wie viel schneller Cython Code machen kann. Wenn ich den Code kompiliert Sie haben (obwohl ich die Funktion von von einem anderen Modul lief) mit distutils , ich habe sehr marginal Geschwindigkeitsgewinne über gerade Python - etwa 1%. Allerdings, wenn ich noch ein paar kleine Änderungen an Ihrem Code:

def test(long long value):
    cdef long long i
    cdef long long z
    for i in xrange(value):
        z = i**2
        if(i==1000000):
            print i
        if z < i:
            print "yes"

und es kompiliert, habe ich mal folgendes:

  • Reiner Python-Code: 20,4553578737 Sekunden
  • Cython Code: ,199339860234 Sekunden

Das ist eine 100-fache Geschwindigkeit-up. Nicht schäbig.

Andere Tipps

Cython ist nicht eine andere Dolmetscher. Es erzeugt C-Erweiterungen für Python, aus Python (-artigen) -Code. cython test.pyx nur erzeugen eine ‚test.c‘ Datei, die (einmal kompiliert) von Python verwendet werden kann wie eine normale Python-Bibliothek.

Das bedeutet, dass Sie nur messen die Zeit, die es braucht, um Ihren cython Python-Code zu c zu übersetzen, nicht, wie schnell diese Version des Codes ausgeführt wird.

  • cython test.pyx nicht wirklich Ihr Programm ausführen. Die cython binär ist für die Bearbeitung Ihrer Cython Code in ein Python-Erweiterungsmodul. Sie würden es in Python importieren müssen, um sie auszuführen.

  • #!/usr/bin/python ist nicht die beste shebang Linie für Python-Skripte. #!/usr/bin/env python ist im allgemeinen bevorzugt, die läuft was auch immer python würde auf der Kommandozeile.

    • Cython pyx Dateien wahrscheinlich nicht eine Shebang-Zeile überhaupt haben, außer in der Ecke Fall, dass sie gültige Python-Programme sind.
  • Sie haben einen IndentationError im geposteten Code.

  • den traditionellen Interpreter ist einfacher und tragbar. Cython ist zuverlässig, aber sie hat ihre Grenzen und Macken. Es könnte überzeugend es Tonnen zu nutzen, wenn sie auf magische Weise die speedups gab Ihre Timings es so aussehen, wie es funktioniert, aber es gibt tatsächlich kleinere. Sie beginnen, müssen mit Cython spezifischen Merkmale C zu verwenden, verfügt über eine Menge von Speedup zu sehen.

Ein großer Punkt, der zu fehlen scheint: Cython ist keine strenge Obermenge von Python. Es gibt einige Features, dass Python unterstützt, aber Cython nicht. Am bemerkenswertesten, Generatoren und Lambda-Ausdrücke (aber sie kommen).

  • Biggest Grund Cython ist nicht so populär ist, dass es eigenständige fehlt (ohne Python) ausführbare Dateien.

  • Mangelnde Werbung. Die Entwickler scheinen Wissenschaftler mehr Interesse an der Entwicklung ihrer Sage Software zu sein, als eine Schneide Sprache.

  • angetroffen Pitfalls während der Entwicklung. Man begegnete ich ist der Mangel an echten Thread-Unterstützung. Alles ist in einem globalen Interpreter Lock eingewickelt, so dass es thread, aber deaktivieren Gleichzeitigkeit!

Für jedermann, dass cython wünscht tatsächlich kompiliert und lief das Programm in einer Zeile, habe ich runcython ( http: // github.com/russell91/runcython ). runcython test.pyx wird die Semantik haben, dass die OP bestimmt

Wie viele Kommentare was auf die Zeit, die Sie mit cython erwähnt haben, ist nur die Zeit genommen in Py-Datei in C-Datei zu konvertieren. Die C-Datei wird großes interms von Speicher sein. Der Vorteil ist, dass Sie auch, dass die C-Datei mit C-Compiler kompilieren

Ich gebe Ihnen ein Beispiel: wenn Sie eine Python-Datei benötigen wir als .pyx Datei zu speichern. Durch das Ausführen " cython xyz.pyx " wird es schaffen .c und .so-Dateien

Lets Check-in-Bild von cython Befehl erstellten Dateien

Die Größe auch steigt in meinem Fall es geändert für Bytes Kb

Es gibt einige spezifische Methode, um den Python-Code zu kompilieren Sie können diese Links verweisen:

http://cython.readthedocs.io/en/latest /src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

eine andere Sache, die ich bemerkt, ist nicht, wo sie die Speicherprobleme in cython erwähnen Wenn ich versuche, in meinem eingebetteten project.I zu implementieren sind vor vielen Problemen mit dem Speicher.

Sie können versuchen, PyPy Wo es keine Notwendigkeit, zusätzliche Anstrengungen zu setzen zusammenzustellen und um die Zeit, auch im Hinblick auf die Übersetzungszeit reduziert

Siehe das Bild: vergleichen Zeit zwischen Python und PyPy

Danke ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top