2009-09-30 14 views
5

Ich bin auf der Suche nach einem Fuzzy-Logik-Controller auf der Grundlage von entweder PyFuzzy (Python) oder FFLL (C++) Bibliotheken.Leistung von Python die Kosten wert?

Ich würde es vorziehen, mit Python zu arbeiten, bin aber unsicher, ob die Leistung in der eingebetteten Umgebung akzeptabel sein wird (entweder ARM oder eingebettet x86 proc beide ~ 64 MB RAM).

Das Hauptproblem ist, dass die Antwortzeiten so schnell wie möglich sind (eine Aktualisierungsrate von 5Hz + wäre ideal> 2Hz ist erforderlich). Das System würde von mehreren (wahrscheinlich 5) Sensoren von einem RS232-Port lesen und basierend auf den Ergebnissen der Fuzzy-Auswertung 2/3 Ausgaben bereitstellen.

Sollte ich besorgt sein, dass Python für diese Aufgabe zu langsam sein wird?

+5

Ich schlage vor, mit einem einfachen Prototyp auf Ihrer spezifischen Plattform zu testen. –

+0

5 Hz ist nicht genau schnelle Reaktionszeit, wenn Sie eine menschliche Interaktion mit dem Gerät benötigen. –

Antwort

35

Im Allgemeinen sollten Sie nicht über die Leistung streben, bis Sie tatsächlich gesehen haben, dass es ein Problem wird. Da wir die Details Ihrer App nicht kennen, können wir nicht sagen, wie sie sich in Python implementieren würde. Und da Sie es noch nicht implementiert haben, können Sie es auch nicht.

Implementieren Sie die Version, mit der Sie am meisten vertraut sind, und implementieren Sie die schnellste zuerst. Dann benchmarken Sie es. Und wenn es ist zu langsam, Sie haben drei Möglichkeiten, die getan werden, um sollte:

  • Zuerst optimieren Sie Ihre Python-Code
  • Wenn das nicht genug ist, schreiben die meisten leistungskritische Funktionen in C/C++, und rufen Sie das aus Ihrem Python-Code
  • Und schließlich, wenn Sie wirklich brauchen Top-Leistung, müssen Sie möglicherweise die ganze Sache in C++ neu schreiben. Aber dann haben Sie wenigstens einen funktionierenden Prototyp in Python, und Sie werden eine viel klarere Vorstellung davon haben, wie es implementiert werden soll. Sie werden wissen, welche Fallstricke Sie vermeiden sollten, und Sie haben bereits eine korrekte Implementierung, mit der Sie die Ergebnisse testen und vergleichen können.
+14

+1 vorzeitige Optimierung ist die Wurzel allen Übels. –

+4

Es ist die Wurzel allen Übels, und es ist alles über Stapelüberlauf. – FogleBird

+1

Stimme in allen Punkten mit jalf überein. Wenn ein Großteil der Arbeit über Bibliotheksaufrufe erledigt wird, spielt es keine große Rolle, ob Sie die Bibliothek von C oder von Python aufrufen. Wenn Sie die integrierten Sprachfunktionen von Python und C-Bibliotheksmodulen verwenden, bemerken Sie möglicherweise nie einen Leistungseinbruch für Python. Wenn Sie versuchen, Ihre eigene FFT in nativem Python oder so ähnlich zu schreiben, werden Sie eine schreckliche Leistung sehen. Verwenden Sie Python, um die wirklich hochstufigen Teile zu schreiben, und versuchen Sie, Python und C-Bibliotheken das schwere Heben zu ermöglichen. – steveha

11

Python ist sehr langsam im Umgang mit großen Mengen von Nicht-String-Daten. Für einige Operationen können Sie sehen, dass es 1000-mal langsamer als C/C++ ist, also sollten Sie dies untersuchen und notwendige Benchmarks durchführen, bevor Sie zeitkritische Algorithmen in Python erstellen.

Sie können jedoch Python mit Modulen in C/C++ - Code erweitern, so dass zeitkritische Dinge schnell sind, während python weiterhin für den Hauptcode verwendet werden kann.

+4

+1 Ich würde auch, als eine Grundlinie, versuchen, es in Python zu schreiben und verlangsamen Teile mit C zu ersetzen, wenn es gebraucht wird. –

5

Lassen Sie es funktionieren, dann machen Sie es schnell.

+1

Vergessen Sie nicht den mittleren Schritt, "Lasse es richtig funktionieren." – JasCav

+0

Ich lege "es richtig arbeiten" in meiner Definition von getan. Aber ich höre dich. – KevDog

1

Wenn der Großteil Ihrer Laufzeit in C-Bibliotheken verbracht wird, ist die Sprache, die Sie zum Aufrufen dieser Bibliotheken verwenden, nicht wichtig. In welcher Sprache sind deine Zeitfresser-Bibliotheken eingeschrieben?

0

Von Ihrer Beschreibung, Geschwindigkeit sollte nicht viel Sorge (und Sie können C, Cython, was auch immer Sie wollen, um es schneller zu machen), aber Speicher wäre. Für Umgebungen mit maximal 64 Mb (wo das Betriebssystem und alle auch passen sollten, oder?), Glaube ich, dass Python möglicherweise nicht das richtige Werkzeug für die Zielbereitstellung ist.

Wenn Sie nicht triviale Logik zu handhaben haben, würde ich immer noch in Python Prototype.

0

Ich habe nie wirklich die Leistung von pyfuzzy's Beispielen gemessen, aber da die neue Version 0.1.0 FCL-Dateien wie FFLL lesen kann. Beschreiben Sie einfach Ihr Fuzzy-System in diesem Format, schreiben Sie einige Wrapper und überprüfen Sie die Performance beider Varianten.

Zum Lesen von FCL mit Pyfuzzy benötigen Sie die Antlr-Python-Laufzeit, aber nach dem Lesen sollten Sie in der Lage sein, das Leseobjekt zu pikern, so dass Sie den Antlr-Overhead auf dem Ziel nicht benötigen.