编程语言
首页 > 编程语言> > python – 在Cython中对memoryview进行排序

python – 在Cython中对memoryview进行排序

作者:互联网

如何在Cython中对就地存储器视图进行排序?是否有内置功能可以做到这一点?现在我必须使用numpy数组而使用numpy的排序,这非常慢.

解决方法:

要跟进我的评论,这里有3个选项(numpy和C和C标准库选项)

from libcpp.algorithm cimport sort
from libc.stdlib cimport qsort

import numpy as np

def sort_numpy(double[:] a, kind):
    np.asarray(a).sort(kind=kind)

# needs to be compiled with C++        
def sort_cpp(double[::1] a):
    # a must be c continuous (enforced with [::1])
    sort(&a[0], (&a[0]) + a.shape[0])

# The C version requires a comparator function
# which is a little slower since it requires calling function pointers
# and passing pointers rather than numbers
cdef int cmp_func(const void* a, const void* b) nogil:
    cdef double a_v = (<double*>a)[0]
    cdef double b_v = (<double*>b)[0]
    if a_v < b_v:
        return -1
    elif a_v == b_v:
        return 0
    else:
        return 1

def sort_c(double[:] a):
    # a needn't be C continuous because strides helps
    qsort(&a[0], a.shape[0], a.strides[0], &cmp_func)

结果将取决于您使用的C/C++标准库,因此不会过多地阅读我的结果.对于1000长阵列(排序5000次),我得到:

06001

即numpy版本最快.对于我得到的100长阵列

06002

即如果你正在排序大量的小数组,调用numpy排序的开销很大,你应该使用C(或可能是C).如果你正在对大型数组进行排序,你可能会发现很难打败numpy.

标签:python,cython,memoryview
来源: https://codeday.me/bug/20190824/1703959.html