어떻게 Cython에서 메모리 뷰를 내부 메모리에서 정렬 할 수 있습니까? 그것을 할 수있는 내장 함수가 있습니까? 지금은 대신 numpy
배열을 사용해야하고 매우 느린 numpy
의 정렬을 사용해야합니다.Cython에서 메모리 뷰 정렬
1
A
답변
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를 호출하는 오버 헤드로 인해 문제가 발생했습니다. –
관련 문제
- 1. 메모리 정렬
- 2. 메모리 정렬
- 3. Cython에서 버퍼 API 사용
- 4. 메모리 뷰에서 하위 뷰
- 5. asp.net의 그리드 뷰 정렬
- 6. 안드로이드리스트 뷰 텍스트 정렬
- 7. UIView의 하위 뷰 정렬
- 8. LinearLayout의 뷰 정렬 방법
- 9. nsxmlparse 테이블 뷰 정렬
- 10. ViewFlipper 내에서 뷰 정렬
- 11. android - 다른 뷰 중앙에 텍스트 뷰 정렬
- 12. FLKAutoLayout을 사용하여 다른 뷰 옆에 뷰 정렬
- 13. Cython에서 매크로를 확장하는 방법
- 14. Cython에서 null 문자가있는 문제
- 15. 항목 유형을 cython에서 정의해야합니까?
- 16. Cython에서 객체 목록 만들기
- 17. Cython에서 코드 최적화 팁
- 18. struct in cython에서 구조체
- 19. Cython에서 함수 유형이 있습니까?
- 20. Cython에서 C struct 만들기
- 21. Cython에서 PyCObject 포인터 만들기
- 22. 디자인 문제 - 컨트롤러 또는 뷰 정렬 정렬?
- 23. InterlockedExchange 및 메모리 정렬
- 24. 클래스의 메모리 정렬
- 25. C++ 메모리 정렬 질문
- 26. Java 메모리 할당 정렬
- 27. 정렬 NSMutableArray 메모리 누수
- 28. OpenCL 용 메모리 정렬
- 29. 인덱스에서 배열의 메모리 정렬
- 30. 메모리 정렬 문제가있는 유니온
'numpy.sort'의 성능에 문제가 있습니까? 아니면 memoryview를 numpy 배열에 복사하는 비용이 있습니까? 후자의 경우'np.asarray (memview)'는 복사본없이 작동해야합니다. – DavidW
@DavidW'numpy.sort'의 성능에 문제가 있습니다. –
다른 알고리즘을 사용하기 위해 numpy를 사용하려고 할 수 있습니다 (3 가지가 있다고 생각합니다). 그게 도움이되지 않으면 C++ 표준 라이브러리 http://www.cplusplus.com/reference/algorithm/sort/를 사용할 수 있습니다. 포인터와 함께 사용하면'sort (& memview [0], memview [length])'와 같은 형태가 될 것입니다. (끝에 하나의 요소를 넘겨 주면 C++로 컴파일해야합니다. – DavidW