Ich muss oft große Zahlenfelder (wenige Milliarden Elemente) sortieren, was zu einem Engpass in meinem Code wurde. Ich suche nach einer Möglichkeit, es parallel zu machen.
Gibt es parallele Implementierungen für die Funktion ndarray.sort()
? Das Numexpr-Modul bietet eine parallele Implementierung für die meisten mathematischen Operationen auf numpigen Arrays, aber es fehlen Sortiermöglichkeiten.
Vielleicht ist es möglich, einen einfachen Wrapper um eine C ++ - Implementierung der parallelen Sortierung zu erstellen und sie über Cython zu verwenden.
Ich habe GCC-Parallelsortierung abgeschlossen. Hier ist der Code:
parallelSort.pyx
%Vor%Zusätzliche Compilerargumente: -fopenmp (Kompilieren) und -lgomp (Verknüpfen)
Dieses Makefile wird es tun:
%Vor%Und das zeigt, dass es funktioniert:
%Vor%edit: behobene Fehler im Kommentar unten bemerkt
Mergesort parallelisiert sich ganz natürlich. Lassen Sie jeden Worker einen beliebigen Chunk vorsortieren, und führen Sie dann einen einzigen Merge-Durchlauf für ihn aus. Das abschließende Zusammenführen sollte nur O (N) -Operationen erfordern, und es ist trivial, eine Funktion dafür in numba oder so zu schreiben.