2016-07-07 3 views
1

어떻게 Cython에서 메모리 뷰를 내부 메모리에서 정렬 할 수 있습니까? 그것을 할 수있는 내장 함수가 있습니까? 지금은 대신 numpy 배열을 사용해야하고 매우 느린 numpy의 정렬을 사용해야합니다.Cython에서 메모리 뷰 정렬

+0

'numpy.sort'의 성능에 문제가 있습니까? 아니면 memoryview를 numpy 배열에 복사하는 비용이 있습니까? 후자의 경우'np.asarray (memview)'는 복사본없이 작동해야합니다. – DavidW

+0

@DavidW'numpy.sort'의 성능에 문제가 있습니다. –

+3

다른 알고리즘을 사용하기 위해 numpy를 사용하려고 할 수 있습니다 (3 가지가 있다고 생각합니다). 그게 도움이되지 않으면 C++ 표준 라이브러리 http://www.cplusplus.com/reference/algorithm/sort/를 사용할 수 있습니다. 포인터와 함께 사용하면'sort (& memview [0], memview [length])'와 같은 형태가 될 것입니다. (끝에 하나의 요소를 넘겨 주면 C++로 컴파일해야합니다. – DavidW

답변

4

내 의견에 후속, 여기에 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++ 표준 라이브러리에 사용하면 너무 많이 내 결과를 읽지 않습니다.

np quick: 0.11296762199890509 
np merge: 0.20624926299933577 
np heap: 0.2944786230000318 
c++: 0.12071316699984891 
c: 0.33728832399901876 

NumPy와 버전은 빠른 즉이다 : 1000 긴 배열을 위해 나는 수 (5000 회 분류). 당신이 작은 배열을 많이 정렬하는 경우 100 긴 배열을 위해 내가

np quick: 0.022608489000049303 
np merge: 0.023513408999860985 
np heap: 0.024136934998750803 
c++: 0.008449130998997134 
c: 0.01909676999821386 

즉를 얻을 NumPy와 종류를 호출의 오버 헤드가 크고, 당신은 C를 사용해야 ++ (또는 아마도 C). 커다란 배열을 정렬한다면 numpy를 맞추기 어려울 수도 있습니다.

+0

감사합니다. numpy를 호출하는 오버 헤드로 인해 문제가 발생했습니다. –