Numpy / Python, das furchtbar gegen Matlab vorgeht

8

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!

    
Nissl 28.09.2010, 17:19
quelle

4 Antworten

27
___ answer3815533 ___

Sie können einige der analysisdist -Aufrufe vermeiden, indem Sie die Zeilen

ersetzen %Vor%

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.

Ich würde auch versuchen,

zu ersetzen %Vor%

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.

    
___ answer3815798 ___

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.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123matlab ___ MATLAB ist eine von MathWorks entwickelte Hochsprachen- und interaktive Programmierumgebung für numerische Berechnungen und Visualisierung. Fragen sollten entweder mit [tag: matlab] oder [tag: oktave] versehen werden, aber nicht mit beiden, es sei denn, die Frage bezieht sich explizit auf beide Pakete. Wenn Sie dieses Tag verwenden, erwähnen Sie bitte die MATLAB-Version, mit der Sie arbeiten (z. B. R2017a). ___ answer3816129 ___

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.

    
___ tag123numpy ___ NumPy ist eine wissenschaftliche und numerische Erweiterung der Programmiersprache Python. ___ qstntxt ___

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!

    
___ qstnhdr ___ Numpy / Python, das furchtbar gegen Matlab vorgeht ___
Justin Peel 28.09.2010, 19:24
quelle
2

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.

    
JudoWill 28.09.2010 18:13
quelle
0

Sie können einige der math.sqrt -Aufrufe vermeiden, indem Sie die Zeilen

ersetzen %Vor%

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.

Ich würde auch versuchen,

zu ersetzen %Vor%

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.

    
Philip Starhill 28.09.2010 17:42
quelle
0

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.

    
Juri Robl 28.09.2010 19:01
quelle

Tags und Links