Получение меньших n элементов списка в Python

Вы можете достичь этой функциональности, создав подклассы SkyFloatingLabelTextField и управляя видимостью заголовка.

final class MovingTitleOnFocusTextField: SkyFloatingLabelTextField {

    override func becomeFirstResponder() -> Bool {
        setTitleVisible(true)
        return super.becomeFirstResponder()
    }

    override func resignFirstResponder() -> Bool {
        setTitleVisible(hasText || hasErrorMessage)
        return super.resignFirstResponder()
    }
}

Если вы используете SkyFloatingLabelTextFieldWithIcon, вы должны также подкласс этого, но та же идея.

10
задан Robert Gamble 8 December 2008 в 19:22
поделиться

5 ответов

Вы на самом деле хотите отсортированную последовательность минут.

mins = items[:n]
mins.sort()
for i in items[n:]:
    if i < mins[-1]: 
        mins.append(i)
        mins.sort()
        mins= mins[:n]

Это работает намного быстрее, потому что Вы даже не смотрите на минуты, если это доказуемо не получило значение, больше, чем данный объект. О 1/10-м время исходного алгоритма.

Это работало в нулевое время на моем Dell. Я должен был выполнить его 10 раз для получения измеримого времени выполнения.

mins(items, n): 0.297000169754
sorted(items)[:n]: 0.109999895096
mins2(items)[:n]: 0.0309998989105

Используя bisect.insort вместо добавляют, и вид может ускорить это волосок далее.

15
ответ дан 3 December 2019 в 14:26
поделиться
import heapq

nlesser_items = heapq.nsmallest(n, items)

Вот правильная версия алгоритма S.Lott:

from bisect    import insort
from itertools import islice

def nsmallest_slott_bisect(n, iterable, insort=insort):
    it   = iter(iterable)
    mins = sorted(islice(it, n))
    for el in it:
        if el <= mins[-1]: #NOTE: equal sign is to preserve duplicates
            insort(mins, el)
            mins.pop()

    return mins

Производительность:

$ python -mtimeit -s "import marshal; from nsmallest import nsmallest$label as nsmallest; items = marshal.load(open('items.marshal','rb')); n = 10"\
 "nsmallest(n, items)"
nsmallest_heapq
100 loops, best of 3: 12.9 msec per loop
nsmallest_slott_list
100 loops, best of 3: 4.37 msec per loop
nsmallest_slott_bisect
100 loops, best of 3: 3.95 msec per loop

nsmallest_slott_bisect в 3 раза быстрее, чем heapq nsmallest (для n=10, len (объекты) =20000). nsmallest_slott_list только незначительно медленнее. Неясно, почему nsmallest heapq является настолько медленным; его алгоритм почти идентичен представленному выше (для маленького n).

12
ответ дан 3 December 2019 в 14:26
поделиться

Мне нравится идея "кучи" erickson. Я не знаю Python также, но здесь, кажется, существует консервированное решение: heapq — алгоритм очереди "кучи"

3
ответ дан 3 December 2019 в 14:26
поделиться

Возможность состоит в том, чтобы использовать разделить пополам модуль:

import bisect

def mins(items, n):
    mins = [float('inf')]*n
    for item in items:
        bisect.insort(mins, item)
        mins.pop()
    return mins

Однако это просто немного быстрее для меня:

mins(items, n): 0.0892250537872
sorted(items)[:n]: 0.0990262031555

Используя психо ускоряет его немного больше:

import bisect
import psyco
psyco.full()

def mins(items, n):
    mins = [float('inf')]*n
    for item in items:
        bisect.insort(mins, item)
        mins.pop()
    return mins

Результат:

mins(items, n): 0.0431621074677
sorted(items)[:n]: 0.0859830379486
2
ответ дан 3 December 2019 в 14:26
поделиться

Если скорость вызывает предельное беспокойство, самый быстрый метод будет с c. Psyco имеет оплачиваемую авансом стоимость, но может оказаться довольно быстрым. Я рекомендовал бы Cython для Python-> c компиляция (более актуальное для pf Пирекса).

Рука, кодирующая его в c, была бы лучшей, и позволила бы Вам использовать структуры данных, характерные для Вашей проблемной области.

Но примечание:

"Компиляция неправильного алгоритма в C не может быть немного быстрее, чем правильный алгоритм в Python" @S.Lott

Я хотел добавить комментарий S.Lott, таким образом, он замечен. Python делает превосходный опытный язык, где можно сгладить алгоритм, который Вы намереваетесь позже перевести на более низкий язык уровня.

2
ответ дан 3 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: