Ich habe viel Spaß beim Erlernen von Python, indem ich eine Anwendung der genetischen Programmierung schreibe.Ich muss eine Funktion beschleunigen. Sollte ich Cython, Ctypes oder etwas anderes verwenden?
Ich hatte auf dieser Seite einige gute Ratschläge von Torsten Marek, Paul Hankin und Alex Martelli.
Das Programm besteht aus 4 Hauptfunktionen:
- erzeugen (zufällig), um einen Ausdrucksbaum.
- bewerten die Eignung des Baumes
- Mischlings
- mutieren
Da alle erzeugen, kreuzung und mutieren 'die Fitness bewerten' nennen. es ist die verkehrsreichste Funktion und ist der primäre Engpass in der Geschwindigkeit.
Wie ist die Natur der genetischen Algorithmen, muss es einen immensen Lösungsraum suchen, je schneller desto besser. Ich möchte jede dieser Funktionen beschleunigen. Ich beginne mit dem Fitness-Evaluator. Meine Frage ist, was der beste Weg ist, dies zu tun. Ich habe Cython, Ctypes und "Linking and Embedding" untersucht. Sie sind alle neu für mich und im Moment ziemlich jenseits von mir, aber ich freue mich darauf, eins und schließlich alle zu lernen.
Die 'Fitness-Funktion' muss den Wert des Ausdrucksbaums mit dem Wert des Zielausdrucks vergleichen. Es wird also aus einem Postfix-Evaluator bestehen, der den Baum in einer Postfix-Reihenfolge liest. Ich habe den ganzen Code in Python.
Ich brauche Ratschläge, die ich jetzt lernen und verwenden sollte: Cython, Ctypes oder Verknüpfung und Einbettung.
Vielen Dank.
Wenn Sie Pythons Profil oder cProfile verwenden, ist eine Sache, die ich sehr praktisch und nützlich finde, ein Visualisierungs-Tool, mit dem ich die Zahlen im Diagramm sehen kann. Mein Favorit ist RunSnakeRun. Es erfordert wxPython und einige andere Abhängigkeiten. Wenn Sie es auf Ihrer cProfile-Ausgabe ausführen, wird ein GUI-Quadratmap-Ding erzeugt, wobei jede Funktion als ein Rechteck gezeichnet wird, nach (gemittelter oder kumulativer) Zeit innerhalb dieser Funktion bemessen ist und Rects für die aufgerufenen Funktionen enthält. Erleichtert das Verständnis der Profilerausgabe. –