В чем разница между
blockquote>sorted(list)
vslist.sort()
?
list.sort
изменяет список на месте & amp; returnNone
sorted
принимает любой итеративный & amp; возвращает новый список, отсортированный.
sorted
эквивалентен этой реализации Python, но встроенная функция CPython должна работать заметно быстрее, поскольку она написана на C:def sorted(iterable, key=None): new_list = list(iterable) # make a new list new_list.sort(key=key) # sort it return new_list # return it
, когда использовать какой?
blockquote>
- Используйте
list.sort
, если вы не хотите сохранять исходный порядок сортировки (таким образом, вы сможете повторно использовать список на месте в памяти.), и когда вы являетесь единственным владельцем списка (если список используется другим кодом и вы его мутируете, вы можете ввести ошибки, в которых используется этот список.)- Используйте
sorted
, если вы хотите сохранить исходный порядок сортировки или когда вы хотите создать новый список, которому принадлежит только ваш локальный код.Можно восстановить исходные позиции списка после list.sort ()?
blockquote>Нет - если вы сами не сделали копию, эта информация теряется, потому что сортировка выполняется на месте.
«И что быстрее? И сколько быстрее?»
blockquote>Чтобы проиллюстрировать pena lty создания нового списка, используйте модуль timeit, вот наша настройка:
import timeit setup = """ import random lists = [list(range(10000)) for _ in range(1000)] # list of lists for l in lists: random.shuffle(l) # shuffle each list shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time """
И вот наши результаты для списка случайно упорядоченных 10000 целых чисел, как мы видим здесь, мы опровергли более ранний микс о создании списка :
Python 2.7
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000) [3.75168503401801, 3.7473005310166627, 3.753129180986434] >>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000) [3.702025591977872, 3.709248117986135, 3.71071034099441]
Python 3
>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000) [2.797430992126465, 2.796825885772705, 2.7744789123535156] >>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000) [2.675589084625244, 2.8019039630889893, 2.849375009536743]
После некоторой обратной связи , Я решил, что еще один тест будет желателен с разными характеристиками. Здесь я предоставляю тот же случайный упорядоченный список из 100 000 в длину для каждой итерации 1000 раз.
import timeit setup = """ import random random.seed(0) lst = list(range(100000)) random.shuffle(lst) """
Я интерпретирую эту большую разницу в размере, полученной от копирования, упомянутого Martijn, но он не доминирует в точке в более старом более популярном ответе здесь, здесь увеличение времени составляет лишь около 10%
>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000) [572.919036605, 573.1384446719999, 568.5923951] >>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000) [647.0584738299999, 653.4040515829997, 657.9457361929999]
. Я также использовал вышеописанное гораздо меньшую сортировку и увидел, что новая версия
sorted
все еще занимает около 2% более продолжительного времени работы на определенной длине 1000.Poke также запускал свой собственный код, вот код:
setup = ''' import random random.seed(12122353453462456) lst = list(range({length})) random.shuffle(lst) lists = [lst[:] for _ in range({repeats})] it = iter(lists) ''' t1 = 'l = next(it); l.sort()' t2 = 'l = next(it); sorted(l)' length = 10 ** 7 repeats = 10 ** 2 print(length, repeats) for t in t1, t2: print(t) print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))
Он нашел для сортировки по длине 1000000 , (побежал 100 раз), аналогичный результат, но только примерно на 5% увеличение времени, вот результат:
10000000 100 l = next(it); l.sort() 610.5015971539542 l = next(it); sorted(l) 646.7786222379655
Заключение:
Сортировка большого размера с помощью
sorted
создание копии, вероятно, будет доминировать над различиями, но сама сортировка доминирует над операцией, и организация кода вокруг этих различий будет преждевременной оптимизацией. Я бы использовалsorted
, когда мне нужен новый отсортированный список данных, и я бы использовалlist.sort
, когда мне нужно было отсортировать список на месте, и пусть это определит мое использование.
Вы можете достичь этого, добавив -fx-padding: -10 0 0 0;
в список ваших стилей.
Для более гибкого решения вы можете использовать информацию FontMetrics
:
FontMetrics metrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(label.getFont());
label.setPadding(new Insets(-metrics.getDescent(), 0, 0, 0));
Примечание: Вы должны вызвать этот код после scene.show()
. До этого графический движок не готов предоставить правильные показатели.
Один из наиболее динамичных способов сделать это - использовать Text
вместо метки и установить boundsType
как VISUAL
. Это приводит к тексту без каких-либо отступов на любой из сторон текста, независимо от размера шрифта.
Text text = new Text();
text.setBoundsType(TextBoundsType.VISUAL);