4 Stimmen

Bewährte Verfahren für das Entwurfsmuster Python-dann-Profil-dann-C?

Ein beliebtes Muster der Softwareentwicklung scheint zu sein:

  1. Tüfteln Sie die Logik und Algorithmen in Python aus.
  2. Profil, um herauszufinden, wo die langsamen Stellen sind.
  3. Ersetzen Sie diese durch C.
  4. Erstellen Sie einen Code, der den besten Kompromiss zwischen hohem Niveau und Schnelligkeit darstellt.

Ich sage "populär", weil ich gesehen habe, wie die Leute darüber gesprochen haben, dass es eine großartige Idee ist.

Aber gibt es Großprojekte, bei denen diese Methode tatsächlich angewandt wurde? Vorzugsweise freie Software-Projekte, damit ich mir ansehen kann, wie sie es gemacht haben - und vielleicht einige bewährte Verfahren lernen kann.

2 Stimmen

Zählen Elemente der integrierten Bibliotheken als "große Projekte"? Es gibt eine Reihe von Dingen (wie cStringIO und cPickle), die genau das getan haben. Ist das ausreichend, um davon zu lernen?

1 Stimmen

Um genau zu sein, handelt es sich nicht um ein Entwurfsmuster im üblichen Sinne, sondern um eine Entwicklungsmethodik

3voto

Michael Dillon Punkte 31142

Es gibt viele verschiedene Arten, wie Menschen an die Entwicklung herangehen.

Manchmal befolgt man Ihre drei Schritte und stellt fest, dass die langsamen Bits auf die äußere Umgebung zurückzuführen sind, so dass eine Umschreibung von Python in C das Problem nicht löst. Diese Art von Langsamkeit kann manchmal auf der Systemseite gelöst werden, und manchmal kann sie in Python durch die Anwendung eines anderen Algorithmus gelöst werden. So kann man beispielsweise Netzwerkantworten in den Cache stellen, so dass man nicht jedes Mal auf das Netzwerk zugreifen muss, oder in SQL kann man die Arbeit in "gespeicherte Prozeduren" verlagern, die auf dem Server laufen und die Größe der Ergebnismenge verringern. Wenn Sie etwas in C umschreiben müssen, suchen Sie in der Regel als erstes nach einer bereits vorhandenen Bibliothek und erstellen einen Python-Wrapper, falls nicht bereits vorhanden. Viele Leute haben diese Wege schon vor Ihnen beschritten.

Oft besteht Schritt 1 darin, die Anwendungsarchitektur zu durchleuchten, den Verdacht zu äußern, dass es in irgendeinem Bereich ein Leistungsproblem geben könnte, und dann eine C-Bibliothek auszuwählen (vielleicht bereits für Python verpackt) und diese zu verwenden. In Schritt 2 wird dann einfach bestätigt, dass es keine wirklich großen Leistungsprobleme gibt, die behoben werden müssen.

Ich würde sagen, dass es für ein Team mit einem oder mehreren erfahrenen Entwicklern besser ist, von Anfang an zu versuchen, Leistungsengpässe vorherzusagen und sie mit bereits vorhandenen Modulen zu entschärfen. Wenn Sie ein Anfänger in Python sind, dann ist Ihr 3-Schritt-Verfahren vollkommen gültig, d.h. Sie sollten mit der Erstellung und dem Testen von Code beginnen und wissen, dass es einen Profiler und die Möglichkeit von schnellen C-Modulen gibt, wenn Sie diese benötigen. Und dann gibt es noch psyco und die verschiedenen Werkzeuge, um eine Anwendung in eine ausführbare Binärdatei einzufrieren.

Wenn Sie wissen, dass Sie einige C- oder C++-Module verwenden müssen, können Sie alternativ dazu die Anwendung von Grund auf in C schreiben, aber Python einbetten, um den größten Teil der Arbeit zu erledigen. Dies funktioniert gut für erfahrene C- oder C++-Entwickler, da sie eine ungefähre Vorstellung von der Art des Codes haben, der in C mühsam zu erledigen ist.

2voto

John La Rooy Punkte 278961

Das dachte ich auch, als ich mit Python anfing

Ich habe Schritt 3 in 12 Jahren zweimal gemacht (soweit ich mich erinnern kann). Nicht oft genug, um es ein Entwurfsmuster zu nennen. Normalerweise reicht es aus, eine vorhandene C-Bibliothek zu wickeln. Normalerweise hat bereits jemand anderes den Wrapper geschrieben.

0voto

Andy Ross Punkte 11205

Schritt 3 ist falsch. In der modernen Welt sind "die langsamen Bits" in mehr als der Hälfte der Fälle I/O- oder netzwerkgebunden oder durch eine andere Ressource außerhalb des Prozesses begrenzt. Sie in irgendetwas umzuschreiben, führt nur zu Fehlern.

5 Stimmen

Ersetzen Sie also in Schritt 2 "langsam" durch "CPU-gebunden und zeitaufwendig" - wenn Sie solche Bits nicht finden können, dann GOTO 4 ;-).

0voto

Vladimir Keleshev Punkte 12396

Mercurial ist ein gutes Beispiel dafür: Es ist geschrieben in Python und C und es ist ungefähr so schnell wie Git, das hauptsächlich in C geschrieben ist.

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