sorting - numpy 数组的并行就地排序

标签 sorting numpy numexpr

我经常需要对大型 numpy 数组(几十亿个元素)进行排序,这成为我的代码的瓶颈。我正在寻找一种并行化它的方法。

ndarray.sort() 函数有并行实现吗? Numexpr 模块为 numpy 数组上的大多数数学运算提供并行实现,但缺乏排序功能。

也许,可以围绕并行排序的 C++ 实现制作一个简单的包装器,并通过 Cython 使用它?

最佳答案

我最终包装了 GCC 并行排序。这是代码:

并行排序.pyx

# cython: wraparound = False
# cython: boundscheck = False
import numpy as np
cimport numpy as np
import cython
cimport cython 

ctypedef fused real:
    cython.char
    cython.uchar
    cython.short
    cython.ushort
    cython.int
    cython.uint
    cython.long
    cython.ulong
    cython.longlong
    cython.ulonglong
    cython.float
    cython.double

cdef extern from "<parallel/algorithm>" namespace "__gnu_parallel":
    cdef void sort[T](T first, T last) nogil 

def numpyParallelSort(real[:] a):
    "In-place parallel sort for numpy types"
    sort(&a[0], &a[a.shape[0]])

额外的编译器参数:-fopenmp(编译)和-lgomp(链接)

这个 makefile 可以做到这一点:

all:
    cython --cplus parallelSort.pyx  
    g++  -g -march=native -Ofast -fpic -c    parallelSort.cpp -o parallelSort.o -fopenmp `python-config --includes`
    g++  -g -march=native -Ofast -shared  -o parallelSort.so parallelSort.o `python-config --libs` -lgomp 

clean:
    rm -f parallelSort.cpp *.o *.so

这表明它有效:

from parallelSort import numpyParallelSort
import numpy as np 
a = np.random.random(100000000)

numpyParallelSort(a) 
print a[:10]

编辑:修复了下面评论中注意到的错误

关于sorting - numpy 数组的并行就地排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551363/

相关文章:

javascript - 用 JavaScript 解释这种排序

java - 如何按某些属性对对象列表进行排序

c - 如何在 Python C API 中获取返回的 PyObject 的指针?

python - numexpr 中的自动 float32 提升

python - 导入 Numexpr Python 时如何修复错误

python-3.x - 尝试为 python3 安装 pytables

ruby - 在 ruby​​ 中合并两个排序列表的内置方法

c# - 当用户单击表头时,如何对 List<T> 进行排序?

python - 等高线动画 matplotlib

pandas - NumPy/ Pandas : convert array of "steps" into bool mask