Ich versuche, die Leistung einiger metrischen Berechnungen mit Cythons prange
zu verbessern. Hier sind meine Codes:
Grundsätzlich wird in jeder Iteration die hausdorff-Metrik zwischen XA
und jedem XB[i]
berechnet. Hier ist die Signatur der Funktion _hausdorff
:
Mein Problem ist, dass sowohl das sequentielle shausdorff
als auch das parallele phausdorff
die gleichen Timings haben. Darüber hinaus scheint phausdorff
überhaupt keinen Thread zu erstellen.
Also meine Frage ist, was ist falsch mit meinem Code, und wie kann ich es beheben, um Threading arbeiten zu bekommen.
Hier ist mein setup.py
:
BEARBEITEN 1: Hier ist ein Link zu dem von cython -a
generierten HTML: custom_metric.html
EDIT 2: Hier ist ein Beispiel, wie Sie die entsprechenden Funktionen aufrufen können (Sie müssen kompilieren die Cython-Datei zuerst)
%Vor%Ich denke, dass die Parallelisierung funktioniert, aber der zusätzliche Aufwand für die Parallelisierung verbraucht die Zeit, die sie gespart hätte. Wenn ich mit Arrays unterschiedlicher Größe versuche, dann sehe ich eine Beschleunigung in der parallelen Version
%Vor%Hier dauert die parallele Version ~ 2/3 der Zeit der seriellen Version für mich, was sicherlich nicht das 1/4 ist, was Sie erwarten würden, aber zumindest einen gewissen Nutzen zeigt.
Eine Verbesserung, die ich anbieten kann, ist, den Code zu ersetzen, der die Kontiguität behebt:
%Vor%mit
%Vor% Dies beschleunigt sowohl die parallelen als auch die nicht parallelen Funktionen ziemlich deutlich (ein Faktor von 2 mit den Arrays, die Sie ursprünglich angegeben haben). Es macht es etwas offensichtlicher, dass Sie durch den Overhead in prange
verlangsamt werden - die serielle Version ist für die Arrays in Ihrem Beispiel tatsächlich schneller.