Сортировка памяти в Cython

Как я могу отсортировать просмотр памяти на месте в Cython? Есть ли встроенная функция, которая может это сделать? Прямо сейчас я должен использоватьnumpy массив вместо и использоватьnumpyЭто очень медленно.

 C_Z_07 июл. 2016 г., 22:23
@DavidW Это проблема с производительностьюnumpy.sort
 DavidW07 июл. 2016 г., 22:09
Это проблема с производительностьюnumpy.sort или со стоимостью копирования памяти в массив Numpy? Если это последний, тоnp.asarray(memview) должен работать без копии.
 DavidW07 июл. 2016 г., 22:38
Вы могли бы попытаться сказать numpy использовать другой алгоритм (я думаю, у него есть выбор 3). Если это не поможет, вы можете использовать стандартную библиотеку C ++cplusplus.com/reference/algorithm/sort, Вы можете использовать его с указателями, чтобы это было что-то вродеsort(&memview[0],&memview[length]) (обратите внимание, что вы пропускаете один элемент после конца. Хотя вам нужно будет скомпилировать его с C ++.

Ответы на вопрос(1)

Решение Вопроса

здесь есть 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

то есть версия NumPyy самая быстрая. За 100 длинный массив я получаю

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

Т.е. если вы сортируете много маленьких массивов, накладные расходы на вызов numpy sort велики, и вы должны использовать C ++ (или, возможно, C). Если вы сортируете большие массивы, вам может быть трудно победить numpy.

 C_Z_13 июл. 2016 г., 16:49
Отлично, спасибо. Затраты на вызов numpy вызывали у меня проблемы

Ваш ответ на вопрос