Kop
Maxim
джентльмены, брек
перл быстрее питона (научный факт), но никто в здравом уме вас на перл не гонит
Сергей
и то и другое для сайтов, умеют примерно одинаково. Ларавель быстрее в 3 раза и примерно столько же меньше по памяти ест.
Сергей
причем интересно, что когда грузишь через Apache Benchmark (ab -n 1000 -c 100), джанга начинает заикаться на второй тысяче запросов, тоесть на повторном запуске теста. Некогда было разбираться, но неприятно. @worlak2
Andrew
А впаривают делать через deque
tm = timeit.timeit('max3(test_list)', number=1, setup="from __main__ import max3, test_list")
print(tm)
tm2 = timeit.timeit('sorted(test_list)[-3:]', number=1, setup="from __main__ import test_list")
print(tm2)
0.6488101999999998
0.8802487999999999
Andrew
простой наколенный тест
Kop
Andrew
Евгений
Перебьёшься
Ваши данные подтвеждены воздухом, не более того...
Andrew
Aragaer
/me не очень понимает, куда тут deque
Aragaer
https://docs.python.org/3/library/bisect.html#module-bisect - вот это нядо
Евгений
Andrew
Размер массива какой?
test_list = [i for i in range(1000000)] + [i for i in range(1000000)]
random.shuffle(test_list)
Aragaer
про deque заявлены быстрые добавление и удаление в начале и в конце
Aragaer
про середину речи нет
Aragaer
но речь идет именно о сортированном
Андрей
Aragaer
потому что нам надо добавлять элемент, а потом удалять минимальный
Amaro
Ну, нахождение трёх максимальных чисел можно сделать за n шагов по три if на каждом, с одним тройным присваиванием, но быстрее сортед оно будет вряд ли. Тестить лень ;)
Евгений
Евгений
Быстрее всего найти 3 максимальных через алгоритм выбора, а не deque
Aragaer
Andrew
Amaro
Вот, а вставка сколько стоит?
Aragaer
константа
Amaro
В среднем 1.5 if плюс сама вставка?
Aragaer
точнее O(3)
Andrew
Aragaer
я кидал ссылку на bisect, там есть метод insort_left
Алексей
Aragaer
ну это вставка в список известного размера
Amaro
Ну так я и говорю, три ИФА и тройное присваивание и есть О(4.5)
Aragaer
бред то, что O(3) это O(1)? 8)
Алексей
вы явно не понимаете суть O нотации
Aragaer
insort это меньше чем три ифа
Amaro
Aragaer
f это O(g) означает, что существуют константы C1 и C2 такие, что C1*f > g > C2*f
Amaro
Три в максимуме
Aragaer
два же
Amaro
Если больше большего или больше среднего или больше меньшего
Amaro
Иначе порядок испортится
Aragaer
а 1 и 3 это такие замечательные функции, которые для любого значения аргумента равны 1 (и соответственно 3)
Алексей
то есть смысл О нотации вообще заключается в том, чтобы показать алгоритм будет вести себя при увеличении числа входных данных, а не сколько ифов там сидит
Aragaer
если f входит в класс O(g), то для любых констант C1 и C2 С1*f + C2 входит в O(g)
Aragaer
ну да
Алексей
Aragaer
короче, вставка в отсортированный список это O(N)
Aragaer
для списка длиной 3 это константа, потому что N является константой
Алексей
Amaro
Просто О(х) та же хрень, что и с*О(х), но за это я и не против.
Aragaer
запись O(3.14) не бессмысленна, а равносильна O(10000) или любое другое число
Алексей
Aragaer
и не должно
Aragaer
еще раз - вставка в список любой фиксированной (или ограниченной сверху) длины - константа
Amaro
Но константа все равно имеет смысл, так как один алгоритм окажется в константу раз быстрее другого. А час или два - это всегда разница ;)))
Aragaer
в данном случае размер списка фиксирован и равен трем, а значит мы вставляем за константу. Вопрос в том, что быстрее - ифы или insort. Мне кажется, что второе. Почему-то
Алексей
Kop
А задающий вопрос уже убежал радоваться сорт и выборке
Aragaer
а я и не пытался это "показать" через О нотацию.
Aragaer
... наверно надо было смайлик добавить
Amaro
В смысле, реализации квиксортов между собой
Алексей
более того, O нотация ничего не говорит про скорость конкретной реализации алгоритма в конкретных условиях, так к примеру алгоритм со сложностью O(n^2) вполне может быстрее чем алгоритм O(n*log(n)) для любого разумного n
Amaro
Алексей
то есть даже в принципе тот самый пороговый n не известен из одной только O нотации, даже порядок
Amaro
Алексей
что делает вещи наподобия O(5) ещё более бессмысленными
Aragaer
ну это вон как недавно оптимизировали умножение, убрав там множитель log(log(N))
Aragaer
ну да, убрали
Amaro
Aragaer
неа
Aragaer
не позволяют
Алексей
Aragaer
О(3) я написал с некоторой долей юмора. Нужно было добавить смайлик. Естессно это константа