2009-07-21 2 views
0

, если мой код просмотров:предел производительности от метода сортировки

arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True) 

что аргумент, который будет ограничивать результат до 50 тегов?

Я предполагаю, что это:

.... limit=50) 

неверен.

более полный код следующим образом:

videoarttags = Media.objects.order_by('date_added'),filter(topic__exact='art') 
audioarttags = Audio.objects.order_by('date_added'),filter(topic__exact='art') 
conarttags = Concert.objects.order_by('date_added'),filter(topic__exact='art') 
arttags = list(chain(videoarttags, audioarttags, conarttags)) 
arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True) 

как включить -

itertools.islice(sorted(...),50) 
+1

sorted() не является фильтром itertools - он возвращает простой список, а не итератор –

+0

моя ошибка. в предыдущей строке кода я использую itertools для объединения кучки меток в «arttags». Я ошибочно думал, что использую фильтр сортировки itertools. – 2009-07-21 23:04:35

+3

@kjarsenal невозможно упорядочить по потоку: вы не можете получить даже первый результат, пока не увидите все входящие (поскольку последний, который вы видите, может быть первым, чтобы уступить!), и itertools - это, конечно, только ориентированные на поток вещи. –

ответ

1

Вы, вероятно, обнаружите, что кусочек работает для вас:

arttags = sorted(arttags, key=operator.attrgetter('date_added'), reverse=True)[:50] 
+0

Да, я тоже так думал, но это не имело никакого эффекта. – 2009-07-21 22:59:28

+0

Каким образом это не сработало? Вы указываете itertools, если хотите итератор, попробуйте 'itertools.islice (sorted (...), 50)' – Markus

+0

код выглядит так: videoarttags = Media.objects.order_by ('date_added'), filter (topic__exact = 'art') audioarttags = Audio.objects.order_by ('date_added'), filter (topic__exact = 'art') conarttags = Concert.objects.order_by ('date_added'), filter (topic__exact = 'art') arttags = list (chaintags, audioarttags, conarttags)) arttags = sorted (arttags, key = operator.attrgetter ('date_added'), reverse = True) как включить - itertools.islice (отсортировано (...), 50) – 2009-07-22 00:26:15

0

Общая идея я думаю, что вы хотите take. От the itertools documentation:

def take(n, iterable): 
    "Return first n items of the iterable as a list" 
    return list(islice(iterable, n)) 
+0

не может понять, как реализовать его в представлении django с помощью модуля. – 2009-07-21 23:47:28

3

насчет heapq.nlargest:
Возвращает список с п крупнейших элементов из набора данных, определенного iterable.key, если это предусмотрено, определяет функцию одного аргумента, который используется для извлечения ключа сравнения от каждого элемента в Iterable: key=str.lower Equivalent to: sorted(iterable, key=key, reverse=True)[:n]

>>> from heapq import nlargest 
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] 
>>> nlargest(3, data) 
[9, 8, 7] 
+0

Это, вероятно, самый быстрый способ получить только первые несколько отсортированных элементов. Это именно то, что я бы предложил. – EOL

0

Я думаю, что я был в значительной степени ложного дерева. То, что я пытаюсь выполнить, на самом деле было очень простым, используя фильтр шаблонов (срез), который я не знал, что могу сделать. код следующим образом:

{% for arttag in arttags|slice:":50" %} 

Да, я чувствую себя довольно глупо, но я рад, что я получил это сделать :-)

0

Вы также можете добавить [: 50] для каждого из звонки objects.order_by.filter. Выполнение этого будет означать, что вам когда-либо понадобится сортировать 150 элементов в памяти в Python, а не, возможно, еще много.

+0

отличная точка. спасибо steve; будет реализовываться. – 2009-07-25 16:45:09

Смежные вопросы