Python: эффективный список памяти с list.sort (cmp = myfnc) - PullRequest
2 голосов
/ 06 августа 2011

Как лучше всего улучшить этот код:

def my_func(x, y):
    ... do smth ...
    return cmp(x',y') 

my_list = range(0, N)
my_list.sort(cmp=my_func)

Список питона занимает много памяти по сравнению с массивом numpy (6800 МБ против 700 МБ), но nympy.array не имеет функции сортировки с аргументом cmp.

Существуют ли другие способы улучшить использование памяти или отсортировать массив numpy с помощью моей функции cmp?

Обновление: мое текущее решение - это функция C (совместно используемая с SWIG), которая сортирует огромный массив целых чисел и возвращает его в python после сортировки.

Но я надеюсь, что есть какой-нибудь способ реализовать эффективную для памяти сортировку огромных наборов данных с помощью Python. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Если вы можете написать ufunc для преобразования вашего массива, вы можете сделать быструю сортировку по argsort:

b = convert(a)
idx = np.argsort(b)
sort_a = a[idx]
0 голосов
/ 06 августа 2011

В качестве альтернативы вы можете использовать встроенный sorted с массивом numpy:

>>> a = np.arange(10, 1, -1)
>>> sorted(a, cmp=lambda a,b: cmp(a,b))
[2, 3, 4, 5, 6, 7, 8, 9, 10]

Это не на месте, поэтому у вас есть 1400 МБ по сравнению с 6800 МБ.

...