Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2012 13:31:50

Mozart
От:
Зарегистрирован: 2011-12-12
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление элементов списка

Спасибо за наглядный тест производительности разных способов :)

При работе с большими списками обязательно буду пользоваться вариантом с count.



Офлайн

#2 Авг. 29, 2012 13:40:05

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Удаление элементов списка

Mozart, да дело не (только) в скорости. Вы посмотрите хотя бы ЧТО вы передаёте в функцию и ЧТО и КАК вы там используете. Надо учиться писать хороший код с самого начала пути, чтобы потом в подобных примерах вам даже в голову не пришло бы пересчитывать максимальный элемент массива или менять массив при итерации по нему.

Ну и сама конструкция, не беря в расчет алгоритмическую сложность, отвратительна, тут даже обсуждать нечего. Создание функции для её однократного вызова в месте её создания, да ещё и с передачей неиспользуемого параметра, использованием глобальной переменной и дублированием названий переменных, - это насилие над программистским разумом.



Отредактировано fata1ex (Авг. 29, 2012 13:46:45)

Офлайн

#3 Авг. 29, 2012 14:23:16

Mozart
От:
Зарегистрирован: 2011-12-12
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление элементов списка

Спасибо за критику, теперь буду более внимателен в своих действиях и смотреть в перспективу на улучшение общей производительности программы. Действительно, мой вариант оказался очень плохим при работе с большими списками, сейчас сам проверил и разница в скорости вычислений видна невооруженным глазом и без бенчмарков.

Ошибка, как я понял, у меня была в том, что функция пересчитывала весь список для каждого элемента этой же функции, т.е. например для величины списка в 10000 элементов общее количество действий выходит 10000 * 10000 против 10000 * 2 (для вычисления max и для вычисления count(max))

Сейчас я учел эту ошибку и сделал вот так:

a=[ ... ]
(lambda x: [max(x)] * x.count(max(x))) (a)

Я лезу с лямбдой постоянно, потому что мне нужно решить эту задачу в 1 действие (дали задание такое =)

Ну или как уже предлагали выше:

a = [ ... ]
a = [b.append(x) for x in a if x == max(a)]



Офлайн

#4 Авг. 29, 2012 14:30:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Удаление элементов списка

Блин, Моцарт,

[max(a)] * a.count(max(a))
это и есть одно действие, нахрена тебе лямбда то?



Отредактировано FishHook (Авг. 29, 2012 14:33:31)

Офлайн

#5 Авг. 29, 2012 14:36:41

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Удаление элементов списка

Mozart lambda используется в 99% случаев для передачи самой себя в другую функцию. Например, в map или filter. Сама по себе она практически не нужна.



Офлайн

#6 Авг. 29, 2012 14:40:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Удаление элементов списка

Еще, решение, проверь на скорость ели хочешь, мне лень

a = [1,2,3,4,5,6,6,6,6,0,1,5]
a.sort()
print a[a.index(a[-1]):]



Отредактировано FishHook (Авг. 29, 2012 14:40:52)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version