py.user.next
И откуда следует, что объекты списка и кортежа хранятся по-разному?
Бля буду кишки в таз :)
py.user.next
Насколько помню (лень смотреть) они там хранятся в виде прицепленного к структуре массива.
Мне, например, не лень не только смотреть, но и делать. Все остальное сказал все правильно, но не сказал суть: где хранится прицепленный к структуре массив? (подскзка: у тьюплов и списков он хранится в разных местах).
py.user.next
Операция-то одна и та же - взятие среза.
В действительности (это неявно), взятие среза у списка - это одна операция, которая создает новый список, а взятие среза у тьюпла - это другая операция, которая создает новый тьюпл. Абстрактно операция одна, а фактически - две разные операции, делающие разные вещи. Причем, занимающие разное время (у списка - больше, у тьюпла - меньше). Ничего, что я начинаю разжевывать и повторяться?
py.user.next
C и C++, это разные языки, а склеивают их обычно те, кто C не знает (теоретизировал после C++ в стиле “гиме зе мер бите… а, ну это я знаю”).
Ключевое слово в этой фразе: теоретизировал. Считаем, что ты говоришь за себя о себе, а не о других. Некультурно говорить о других, ничего о них не зная. Совет. И да, без обид, ничего личного.
py.user.next
Если подаётся кортеж, для сортировки его элементов нужно их переставлять, а так как порядок элементов кортежа можно определить один раз, то делается список, чтобы там можно было обмены совершать по мере сортировки
Все правильно, но речь шла совсем о другом.
py.user.next
Как-то у тебя странно: ты хотел использовать итераторы, но так как они криво пошли, ты переключился на кортежи. Но ведь кортежи жрут память, и практически то же количество, что и списки.
Итератолры пошли великолепно (особенно по сравнению с вызовом pop первого элемента в цикле), потому что скорость работы merge увеличилась в десятки раз. Можно ее отдельно потестировать и убедиться в этом, чтобы все остальные посмотрели. Мы же (то есть ты), стал тестировать mergesort (не inplace), на основе такой же merge (то есть не inplace). У Кнута, кстати, подробно рассмотрены десятки алгоритмов сортировки, рекомендую.
py.user.next
У меня там списки не просто так, а для возможности выполнения pop(). И по ним ещё и условие проверяется, пуст/не пуст.
Вот эот pop и делает алгоритм merge ужасно неэффективным.
py.user.next
В общем, у тебя какая-то комбинация получилась запутанная. С одной строны ты хотел применить итераторы, но оказалось, что там надо копировать части. И в итоге ты их использовал хотя бы где-то. А если всё делать на итераторах, то оно как-то не получается ;)
А всё почему? Потому что в итераторе ты не можешь менять порядок элементов.
Предлагаю распутать эту ситуацию, предложив людям два способа merge и mergesort: итерабельный и inplace. С итерабельным вариант готов, осталось все то же самое сделать inplace и довести их до совершенства. Кто начнет? Готов? А бессмысленную полемику предлагаю отставить.
py.user.next
slice(1, 3)
slice позволяет использовать итераторы. Но результат тот же: срез от списка - создает новый список, срез от тьюпла - создает новый тьюпл, срез от итератора создает новый итератор. В твоем примере просто создается новый список.
Чтобы написать оптимальный код, надо представлять что происходит на уровне команд процессора (CPU то есть). Теория и практика (Бог) в помощь.