Angesichts einer Scipy CSC Sparse-Matrix "sm" mit Dimensionen (170k x 170k) mit 440 Millionen Nicht-Null-Punkten und einem spärlichen CSC-Vektor "v" (170k x 1) mit einigen Nicht-Null-Punkten, gibt es irgendetwas das kann getan werden, um die Leistung der Operation zu verbessern:
%Vor%?
Momentan dauert es ungefähr 1 Sekunde. Durch das Initialisieren der Matrizen als CSR wurde die Zeit um bis zu 3 Sekunden erhöht, sodass CSC besser abschnitt.
SM ist eine Matrix von Ähnlichkeiten zwischen Produkten und V ist der Vektor, der angibt, welche Produkte der Benutzer gekauft oder angeklickt hat. Also für jeden Benutzer sm ist das gleiche.
Ich benutze Ubuntu 13.04, Intel i3 @ 3.4GHz, 4 Cores.
Recherchiere über SO Ich lese über Ablas-Paket. Ich tippte in das Terminal:
%Vor%Was dazu führte:
%Vor%Und was ich verstanden habe, bedeutet, dass ich bereits ein Hochleistungspaket von Ablas verwende. Ich bin mir immer noch nicht sicher, ob dieses Paket bereits parallele Berechnungen implementiert, aber es sieht so aus.
Könnte die Multi-Core-Verarbeitung die Leistung steigern? Wenn ja, gibt es eine Bibliothek, die in Python hilfreich sein könnte?
Ich habe auch über die Idee nachgedacht, dies in Cython zu implementieren, aber ich weiß nicht, ob dies zu guten Ergebnissen führen würde.
Vielen Dank im Voraus.
Die Sparse-Matrix-Multiplikationsroutinen sind direkt in C ++ codiert, und soweit ein kurzer Blick auf die Quelle zeigt, scheint es keinen Haken bei einer optimierten Bibliothek zu geben. Außerdem scheint es nicht auszunutzen, dass die zweite Matrix ein Vektor ist, um Berechnungen zu minimieren. So können Sie die Dinge wahrscheinlich etwas beschleunigen, indem Sie auf die Eingeweide der dünn besetzten Matrix zugreifen und den Multiplikationsalgorithmus anpassen. Der folgende Code tut dies in reinem Python / Numpy, und wenn der Vektor wirklich "ein paar Nicht-Null-Punkte" hat, stimmt er mit der Geschwindigkeit von scipys C ++ Code überein: Wenn Sie ihn in Cython implementiert haben, sollte der Geschwindigkeitsanstieg spürbar sein:
%Vor%Eine kurze Erklärung dessen, was vor sich geht: Eine CSC-Matrix ist in drei linearen Arrays definiert:
data
enthält die Nicht-Null-Einträge, die in der Reihenfolge der Spalten gespeichert sind. indices
enthält die Zeilen der Nicht-Null-Einträge. indptr
hat einen Eintrag mehr als die Anzahl der Spalten der Matrix, und Elemente in der Spalte j
werden in data[indptr[j]:indptr[j+1]]
gefunden und sind in Zeilen indices[indptr[j]:indptr[j+1]]
. Um also mit einem dünnen Spaltenvektor zu multiplizieren, können Sie über data
und indices
des Spaltenvektors iterieren und für jedes (d, r)
-Paar die entsprechende Spalte der Matrix extrahieren und mit d
multiplizieren , zB data[indptr[r]:indptr[r+1]] * d
und indices[indptr[r]:indptr[r+1]]
.
Tags und Links python performance sparse-matrix scipy matrix-multiplication