如何在 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 次),我得到:
np quick: 0.11296762199890509
np merge: 0.20624926299933577
np heap: 0.2944786230000318
c++: 0.12071316699984891
c: 0.33728832399901876
即 numpy 版本是最快的。对于 100 长的数组我得到
np quick: 0.022608489000049303
np merge: 0.023513408999860985
np heap: 0.024136934998750803
c++: 0.008449130998997134
c: 0.01909676999821386
即,如果您要对大量小数组进行排序,则调用 numpy sort 的开销很大,您应该使用 C++(或者可能是 C)。如果您要对大型数组进行排序,您可能会发现很难击败 numpy。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)