Anfänger Programmierer hier. Ich schreibe ein Programm, das die relative räumliche Lage von Punkten (Zellen) analysiert. Das Programm erhält Grenzen und Zelltypen von einem Array mit der x-Koordinate in Spalte 1, der y-Koordinate in Spalte 2 und dem Zelltyp in Spalte 3. Es prüft dann jede Zelle auf Zellentyp und geeigneten Abstand von den Grenzen. Wenn es passiert, berechnet es dann seinen Abstand von jeder anderen Zelle in dem Array und wenn die Entfernung innerhalb eines spezifizierten Analysebereichs liegt, addiert es es zu einem Ausgabe-Array in diesem Abstand.
Mein Zellmarkierungsprogramm ist in wxpython, also hoffte ich, dieses Programm auch in Python zu entwickeln und es schließlich in die GUI zu stecken. Unglücklicherweise benötigt Python im Moment ~ 20 Sekunden, um die Kernschleife auf meinem Rechner auszuführen, während MATLAB ~ 15 Schleifen / Sekunde ausführen kann. Da ich vorhabe, an ~ 30 Fällen mit mehreren explorativen Analysetypen 1000 Schleifen (mit einer randomisierten Vergleichsbedingung) durchzuführen, ist dies kein trivialer Unterschied.
Ich habe versucht, einen Profiler laufen und Array-Aufrufe sind 1/4 der Zeit, fast der gesamte Rest ist unspezifizierte Schleife Zeit.
Hier ist der Python-Code für die Hauptschleife:
%Vor%Hier ist der Matlab-Code für die Hauptschleife:
%Vor%Danke!
Sie können einige der analysisdist
-Aufrufe vermeiden, indem Sie die Zeilen
mit
%Vor%wo Sie die Zeile haben
%Vor%außerhalb der Hauptschleife Ihrer Funktion.
Da analysisdist
in der innersten Schleife aufgerufen wird, sollten Sie arraytarget
oben im Modul haben und einfach die Funktion als analysisdist2
aufrufen.
mit
%Vor%Es besteht die Möglichkeit, dass ein schnellerer Byte-Code erzeugt wird, um die Multiplikation statt der Potenzierung durchzuführen.
Ich bezweifle, dass Sie dadurch die Leistung von MATLAB erreichen, aber sie sollten dazu beitragen, den Overhead zu reduzieren.
Nicht ganz sicher über die Langsamkeit von Python, aber Sie Matlab-Code kann HOCH optimiert werden. Geschachtelte for-Schleifen haben oft schreckliche Leistungsprobleme. Sie können die innere Schleife durch eine vektorisierte Funktion ... wie folgt ersetzen:
%Vor%Es kann einige kleine Fehler darin geben, da ich keine Daten habe, um den Code mit zu testen, aber es sollte ~ 10x Geschwindigkeit auf dem Matlab-Code bekommen.
Aus meiner Erfahrung mit numpy habe ich bemerkt, dass das Austauschen von for-Schleifen für vektorisierte / matrixbasierte Arithmetik auch merkliche Beschleunigungen hat. Aber ohne die Formen der Formen all Ihrer Variablen ist es schwierig, Dinge zu vektorisieren.
Wenn Sie ein Multicore haben, könnten Sie vielleicht das Multiprocessing-Modul ausprobieren und mehrere Prozesse verwenden, um alle Kerne zu nutzen.
Anstelle von sqrt könnten Sie x ** 0.5 verwenden, was, wenn ich mich richtig erinnere, etwas schneller ist.
Anfänger Programmierer hier. Ich schreibe ein Programm, das die relative räumliche Lage von Punkten (Zellen) analysiert. Das Programm erhält Grenzen und Zelltypen von einem Array mit der x-Koordinate in Spalte 1, der y-Koordinate in Spalte 2 und dem Zelltyp in Spalte 3. Es prüft dann jede Zelle auf Zellentyp und geeigneten Abstand von den Grenzen. Wenn es passiert, berechnet es dann seinen Abstand von jeder anderen Zelle in dem Array und wenn die Entfernung innerhalb eines spezifizierten Analysebereichs liegt, addiert es es zu einem Ausgabe-Array in diesem Abstand.
Mein Zellmarkierungsprogramm ist in wxpython, also hoffte ich, dieses Programm auch in Python zu entwickeln und es schließlich in die GUI zu stecken. Unglücklicherweise benötigt Python im Moment ~ 20 Sekunden, um die Kernschleife auf meinem Rechner auszuführen, während MATLAB ~ 15 Schleifen / Sekunde ausführen kann. Da ich vorhabe, an ~ 30 Fällen mit mehreren explorativen Analysetypen 1000 Schleifen (mit einer randomisierten Vergleichsbedingung) durchzuführen, ist dies kein trivialer Unterschied.
Ich habe versucht, einen Profiler laufen und Array-Aufrufe sind 1/4 der Zeit, fast der gesamte Rest ist unspezifizierte Schleife Zeit.
Hier ist der Python-Code für die Hauptschleife:
%Vor%Hier ist der Matlab-Code für die Hauptschleife:
%Vor%Danke!
Nicht ganz sicher über die Langsamkeit von Python, aber Sie Matlab-Code kann HOCH optimiert werden. Geschachtelte for-Schleifen haben oft schreckliche Leistungsprobleme. Sie können die innere Schleife durch eine vektorisierte Funktion ... wie folgt ersetzen:
%Vor%Es kann einige kleine Fehler darin geben, da ich keine Daten habe, um den Code mit zu testen, aber es sollte ~ 10x Geschwindigkeit auf dem Matlab-Code bekommen.
Aus meiner Erfahrung mit numpy habe ich bemerkt, dass das Austauschen von for-Schleifen für vektorisierte / matrixbasierte Arithmetik auch merkliche Beschleunigungen hat. Aber ohne die Formen der Formen all Ihrer Variablen ist es schwierig, Dinge zu vektorisieren.
Sie können einige der math.sqrt
-Aufrufe vermeiden, indem Sie die Zeilen
mit
%Vor%wo Sie die Zeile haben
%Vor%außerhalb der Hauptschleife Ihrer Funktion.
Da math.sqrt
in der innersten Schleife aufgerufen wird, sollten Sie from math import sqrt
oben im Modul haben und einfach die Funktion als sqrt
aufrufen.
mit
%Vor%Es besteht die Möglichkeit, dass ein schnellerer Byte-Code erzeugt wird, um die Multiplikation statt der Potenzierung durchzuführen.
Ich bezweifle, dass Sie dadurch die Leistung von MATLAB erreichen, aber sie sollten dazu beitragen, den Overhead zu reduzieren.