Вы можете достичь этой функциональности, создав подклассы 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
, вы должны также подкласс этого, но та же идея.
Вы на самом деле хотите отсортированную последовательность минут.
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
вместо добавляют, и вид может ускорить это волосок далее.
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).
Мне нравится идея "кучи" erickson. Я не знаю Python также, но здесь, кажется, существует консервированное решение: heapq — алгоритм очереди "кучи"
Возможность состоит в том, чтобы использовать разделить пополам модуль:
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
Если скорость вызывает предельное беспокойство, самый быстрый метод будет с c. Psyco имеет оплачиваемую авансом стоимость, но может оказаться довольно быстрым. Я рекомендовал бы Cython для Python-> c компиляция (более актуальное для pf Пирекса).
Рука, кодирующая его в c, была бы лучшей, и позволила бы Вам использовать структуры данных, характерные для Вашей проблемной области.
Но примечание:
"Компиляция неправильного алгоритма в C не может быть немного быстрее, чем правильный алгоритм в Python" @S.Lott
Я хотел добавить комментарий S.Lott, таким образом, он замечен. Python делает превосходный опытный язык, где можно сгладить алгоритм, который Вы намереваетесь позже перевести на более низкий язык уровня.