matlab und Python: Geschwindigkeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

Da ich die matlab-Sprache furchtbar hässlich finde habe ich mir mal numpy angeschaut. Allerdings ist der Geschwindigkeitsverlust bei meinen ersten kleinen Tests jenseits von gut und böse. Mache ich in diesem trivialen Beispiel zum Beispiel irgendetwas falsch?

Code: Alles auswählen

In [17]: a = numpy.random.rand(10000, 500)

In [18]: b = numpy.random.rand(500, 10000)

In [19]: time c = numpy.dot(a, b)
CPU times: user 55.55 s, sys: 0.27 s, total: 55.82 s
Wall time: 55.92 s
Matlab:

Code: Alles auswählen

>> a = rand(10000, 500);
>> b = rand(500, 10000);
>> tic; a * b; toc
Elapsed time is 3.759658 seconds.
Matlab benutzt direkt alle 4 Kerne, Python nur einen - gibt es da noch irgendwelche Tricks um Python zu beschleunigen?
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Rechnet matlab evtl. standardmäßig mit 32-Bit floats? Probier mal das aus:

Code: Alles auswählen

a = numpy.random.rand(10000, 500).astype("float32")
b = numpy.random.rand(500, 10000).astype("float32")
c = numpy.dot(a, b)
Bei mir rechnet das ca. 7s. Allerdings läuft die Orginalvariante bei mir auch in etwa 13s. Das wundert mich etwas, da ich mit einem auch nicht mehr ganz neuen 350EUR Laptop arbeite (dein Rechner hört sich erstmal schneller an).
Versuch mal das Skript nicht in IPython sondern als einzeln stehende Datei auszuführen. Ich könnte mir durchaus vorstellen das du vorher noch mehr solche Brocken eingetippt hast und einfach der Speicher voll war.
Wenn ich mir die Größe deiner Matrizen anzeige...:

Code: Alles auswählen

>>> numpy.who()
Name            Shape               Bytes            Type
==============================================================

a               10000 x 500         40000000         float64
c               10000 x 10000       800000000        float64
b               500 x 10000         40000000         float64

Upper bound on total bytes  =       880000000
... könnt ich mir so etwas durchaus vorstellen. 0,9 GB sind ja eben nicht gerade wenig...
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

pudeldestodes hat geschrieben:Matlab benutzt direkt alle 4 Kerne, Python nur einen - gibt es da noch irgendwelche Tricks um Python zu beschleunigen?
Das liegt weniger an Python, sondern mehr an der verwendeten Mathe-Bibliothek. Evtl. hilft da eine neuere numpy-Version oder die Version von EPD. Ich benutzte numpy 1.5.1 und das benutzt alle beiden Kerne. Aber keine Ahnung welche BLAS-Bibliothek das benutzt.

Das sind bei mir jetzt 8 (Matlab) vs. 18 Sekunden (EPD Python). Wobei Python nur in 32 bit läuft.
pudeldestodes
User
Beiträge: 65
Registriert: Samstag 9. Juni 2007, 23:45

So, zurück aus dem Wochenende:
HerrHagen hat geschrieben:Rechnet matlab evtl. standardmäßig mit 32-Bit floats?
Nein, bei mir werden zumindest direkt 64-bit floats erzeugt.
Darii hat geschrieben:Das liegt weniger an Python, sondern mehr an der verwendeten Mathe-Bibliothek.
Das hat mich dann auf die Spur gebracht. Nachdem ich ATLAS (libatlas3gf-base) aus dem Ubuntu 11.04 Repository installiert habe, dauert die Rechnung jetzt auch 6 Sekunden und zwei Kerne werden genutzt.

Es scheint theoretisch drei Möglichkeiten für Numpy zu geben: LAPACK+ATLAS, MKL für Intelprozessoren oder ACML für AMD-Prozessoren. Mein Versuch LAPACK+ATLAS mal lokal selbst zu kompilieren (hier unter "Building everything from source with gfortran on Ubuntu (Nov 2010)") ist mit der aktuellen unstable-Version (3.9.41, make shared/ptshared läuft nicht) und der aktuellen stable-Version (muss ich nochmal versuchen, hab schon wieder vergessen an was ich dort gescheiert bin) aber fehlgeschlagen - ich muss mal noch die in der Anleitung verwendete unstable-Version ausprobieren. Aber danke schon mal für eure Hilfe. Jetzt weiß ich zumindest, dass für solche Matrizen-Operationen eigentlich eine ähnliche Geschwindigkeit wie bei Matlab möglich sein müsste.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Da kann ich dir jetzt auch nicht weiterhelfen, ich habs aufgegeben numpy selbst kompilieren zu wollen, das ist mir einfach zu kompliziert. Irgendwas geht immer schief.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Code: Alles auswählen

sudo python setup.py install
ist mit vorheriger Installation von ATLAS kompliziert?

Wie auch immer, abgesehen von BLAS/LAPACK/ATLAS ist auch numexpr ein interessanter Link für das Arbeiten mit großen Matrices wenn es darum geht gute Speicher/CPU-Performance-Balance zu haben.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

CM hat geschrieben:ist mit vorheriger Installation von ATLAS kompliziert?
Das Problem ist, dass die meisten Online-Anleitungen (auch die bei scipy.org) veraltet sind. Der NumPy Source Code hat allerdings eine Anleitung dabei, die bei mir wunderbar funktioniert hat.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ah, ok. Danke.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

CM hat geschrieben:

Code: Alles auswählen

sudo python setup.py install
ist mit vorheriger Installation von ATLAS kompliziert?
Wenn es denn bloß so einfach funktionieren würde…
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Woran krankt es denn?
Antworten