Beste Weg, um Python / numpy performancewise zu verlängern

Da gibt es eine Vielzahl von Möglichkeiten, um binäre Module für Python zu schreiben, ich hüpfte die von Ihnen mit Erfahrung konnte Ratschläge über die beste Annäherung, wenn ich die Leistung einiger Segmente des Codes so viel wie möglich verbessern möchte.

Wie ich verstehe, kann man entweder eine Erweiterung mit dem Python / numpy C-api schreiben oder einige bereits geschriebene C / C ++ / Fortran-Funktion aus dem Python-Code aufrufen.

Natürlich sind Werkzeuge wie Cython der einfachste Weg zu gehen, aber ich nehme an, dass das Schreiben des Codes von Hand eine bessere Kontrolle und eine bessere Leistung bietet.

Die Frage, und es kann allgemein sein, ist welcher Ansatz zur Verwendung. Schreiben Sie eine C- oder C ++ – Erweiterung? Verpacken Sie externe C / C ++ – Funktionen oder verwenden Sie den Rückruf zu den Pythonfunktionen?

Ich schreibe diese Frage nach dem Lesen von Kapitel 10 in Langtangens "Python-Skripting für Computational Science", wo es einen Vergleich von mehreren Methoden zur Schnittstelle zwischen Python und C.

  • Ändern der Druckereinstellungen in Windows programmgesteuert
  • Kannst du eine Permutationsfunktion genauso elegant in C # schreiben?
  • Was sind einige Techniken für die Codegenerierung?
  • Gibt es ein Äquivalent von Pythons Bereich (12) in C #?
  • TNonblockingServer in Sparsamkeit stürzt ab, wenn TFramedTransport öffnet
  • CPython ist Bytecode-Interpreter?
  • 2 Solutions collect form web for “Beste Weg, um Python / numpy performancewise zu verlängern”

    Ich würde sagen, es hängt von Ihren Fähigkeiten / Erfahrungen und Ihrem Projekt ab. Wenn dies sehr ponctual ist und Sie sind in C / C ++ und Sie haben bereits Python Wrapper geschrieben, dann schreiben Sie Ihre eigene Erweiterung und Schnittstelle es.

    Wenn du mit Numpy an einem anderen Projekt arbeiten wirst, dann geh für die Numpy C-API, es ist umfangreich und ziemlich gut dokumentiert, aber es ist auch ziemlich viel Dokumentation zu verarbeiten. Zumindest hatte ich eine Menge Schwierigkeiten, es zu verarbeiten, aber dann sauge ich wieder an C.

    Wenn Sie nicht wirklich sicher sind Cython, weit weniger zeitaufwendig und die Leistung sind in den meisten Fällen sehr gut. (Meine Wahl) Aus meiner Sicht muss man ein guter C-Codierer sein, um besser als Cython mit der 2 vorherigen Implementierung zu machen, und es wird viel komplexer und zeitaufwendiger sein. Also bist du ein großer C-Codierer?

    Auch könnte es sich lohnen, in pycuda oder ein anderes GPGPU Zeug zu schauen, wenn du nach Leistung suchst, je nach Ihrer Hardware natürlich.

    Ein guter Vergleich verschiedener Ansätze findet sich hier . Ich habe beide Cython ausprobiert und meinen eigenen Fortran-Code mit f2py verpackt. Ich fand, dass f2py war der bessere Weg, um für meine Zwecke zu gehen. Dies war teilweise beeinflusst von der Tatsache, dass ich Fortran verstehe, aber ehrlich moderne Dialekte wie Fortran 90 wird sinnvoll ähnlich wie python-Code mit numpy und sollte nicht so schwer zu holen.

    Mit Cython fangen Sie mit dem langsamen, reinen Python-Code an, dann müssen Sie durch einen langwierigen Prozess der Instrumentierung Ihres Codes gehen, herauszufinden, wo alle Anrufe an die Python-API sind, und die Eingabe der relevanten Zython-Keywords an den richtigen Stellen zu drehen Es in schneller C-Code. Mit Fortran, schreibst du einfach einen normalen Code und du wirst schon voll kompilierte Geschwindigkeit, ohne einen unordentlichen iterativen Prozess zu machen.

    Darüber hinaus führen bestimmte Array-Operationen in Zython immer noch zu langsamen Anrufen an die Python-API, insbesondere diejenigen, die in Slice-Operationen beteiligt sind. In constrast sind Arrays in Fortran einheimische Typen, die der Compiler versteht und optimieren kann. Ich habe gesagt, dass Cython ziemlich schnell vorrückt, so dass sich dies in der Zukunft ändern kann.

    Der größte Nachteil, den ich bei f2py gefunden habe, ist, dass es keine Arrays von abgeleiteten Typen unterstützt (analog zum numpy's Recarray). Es gab eine gewisse Hoffnung, dass es sich um einen Ersatz für f2py handeln würde, der diese Probleme lösen würde, aber es scheint im Moment auf dem Backburner zu sein. Übrigens basiert es auf Zython.

    Python ist die beste Programmiersprache der Welt.