3 Stimmen

Ist es sinnvoll, Python mit C zu integrieren, um die Leistung zu steigern?

Ich verwende Python für fast alles und hatte immer im Hinterkopf, dass ich, falls ich aus irgendeinem Grund einen Engpass in meinem Python-Code finden sollte (aufgrund der Einschränkungen von Python), immer ein in meinen Code integriertes C-Skript verwenden könnte.

Aber als ich anfing, ein Buch zu lesen Leitfaden wie man Python integriert. In dem Artikel sagt der Autor:

Es gibt mehrere Gründe, warum man Python in C oder C++ erweitern möchte, z. B.:

  • Aufrufen von Funktionen in einer vorhandenen Bibliothek.
  • Hinzufügen eines neuen Buildin-Typs zu Python
  • Optimierung der inneren Schleifen im Code
  • Eine C++-Klassenbibliothek für Python zugänglich machen
  • Einbettung von Python in eine C/C++-Anwendung

Nichts über Leistung. Also frage ich wieder, ist es sinnvoll, Python mit C für die Leistung zu integrieren?

8voto

Boris Guéry Punkte 46567

* Optimierung innerer Schleifen im Code

Geht es dabei nicht um Leistung?

8voto

Kai Punkte 9186

Meiner Erfahrung nach ist es selten notwendig, mit C zu optimieren. Ich ziehe es vor, Engpässe zu identifizieren und Algorithmen in diesen Bereichen vollständig in Python zu verbessern. Die Verwendung von Hash-Tabellen, die Zwischenspeicherung von Daten und die allgemeine Umstrukturierung Ihrer Datenstrukturen, um sie an künftige Anforderungen anzupassen, haben ein erstaunliches Potenzial, Ihr Programm zu beschleunigen. Im Laufe der Entwicklung Ihres Programms werden Sie ein besseres Gefühl dafür bekommen, welche Art von Material vorberechnet werden kann, also scheuen Sie sich nicht, Ihre Speicherung und Algorithmen zu überarbeiten. Suchen Sie außerdem nach Möglichkeiten, "zwei Fliegen mit einer Klappe" zu schlagen, z. B. durch Sortieren von Objekten beim Rendern, anstatt große Sortierungen vorzunehmen.

Wenn alles nach bestem Wissen und Gewissen bearbeitet wurde, würde ich einen Optimierer wie Psyco . Ich habe buchstäblich 10-fache Leistungsverbesserungen erfahren, indem ich Psyco verwendet und eine Zeile zu meinem Programm hinzugefügt habe.

Wenn alles andere fehlschlägt, verwenden Sie C an den richtigen Stellen und Sie werden bekommen, was Sie wollen.

7voto

Jared Punkte 38791

Leistung ist ein weit gefasstes Thema, daher sollten Sie sich genauer ausdrücken. Wenn der Engpass in Ihrem Programm viel mit Netzwerken zu tun hat, dann wird es wahrscheinlich keinen Unterschied machen, es in C/C++ umzuschreiben, da es die Netzwerkaufrufe sind, die die Zeit in Anspruch nehmen, nicht Ihr Code. Es wäre besser, den langsamen Teil Ihres Programms umzuschreiben, um weniger Netzwerkaufrufe zu verwenden und so die Zeit zu reduzieren, die Ihr Programm mit dem Warten auf Entwork IO verbringt. Wenn Sie rechenintensive Aufgaben wie das Lösen von Differentialgleichungen ausführen und wissen, dass es C-Bibliotheken gibt, die eine bessere Leistung bieten als die, die Sie derzeit in Python ausführen, sollten Sie den Teil Ihres Programms umschreiben, der diese Bibliotheken verwendet, um die Leistung zu erhöhen.

4voto

Eric Drechsel Punkte 2584

Die C-Erweiterungs-API ist bekanntermaßen schwer zu handhaben, aber es gibt eine Reihe von anderen Möglichkeiten, C-Code zu integrieren.

Einige brauchbare Alternativen finden Sie unter http://www.scipy.org/PerformancePython insbesondere den Abschnitt über die Verwendung von Weave zum einfachen Inlining von C-Code.

Ebenfalls von Interesse ist Cython das ein gutes System für die Integration mit C-Code bietet. Cython wird von einigen angesehenen Hochleistungs-Python-Projekten zur Optimierung verwendet, wie z. B. NumPy et Salbei .

Wie oben erwähnt, Psyco ist eine weitere attraktive Option für die Optimierung, und eine, die erfordert nichts weiter als

import psyco
psyco.bind(myfunction)

Psyco erkennt Ihre inneren Schleifen und ersetzt automatisch optimierte Versionen der Routinen.

3voto

JimB Punkte 95188

C kann definitiv prozessorgebundene Aufgaben beschleunigen. Die Integration ist jetzt noch einfacher, mit der ctypes-Bibliothek, oder Sie könnten für eine der anderen Methoden, die Sie erwähnen, gehen.

Meiner Meinung nach hat Mercurial gute Arbeit bei der Integration geleistet, wenn Sie sich ihren Code als Beispiel ansehen wollen. Die rechenintensiven Aufgaben sind in C, und alles andere ist Python.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X