Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2015 01:45:53

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

На одном форуме один чувак утверждает, что это быдлокод:

for i in range(len(lst)):
    do_something(lst[i])
Правильно это или нет?

Офлайн

#2 Май 24, 2015 01:58:20

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

maxim83632
На одном форуме один чувак утверждает, что это быдлокод:
ДА!
так как можно сделать так
for i in lst:
    do_something(i)
или
map(do_something, lst)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Май 24, 2015 01:59:33)

Офлайн

#3 Май 24, 2015 02:02:38

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

maxim83632

Если Вам не нужны индексы (точнее нужны просто, чтобы получить элемент) и Вы не собираетесь их анализировать и с ними напрямую работать, то да. Этот код не есть гуд

Отредактировано 4kpt_III (Май 24, 2015 02:03:07)

Офлайн

#4 Май 24, 2015 02:31:00

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

А если нужно изменять список?
Он объясняет, что это быдло код так:

Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция и, следовательно, вся совокупность операций, то есть весь цикл for. Если бы мы оперировали массивом, то сложность этого цикла составляла бы O(n), но т.к. у нас список - сложность этого цикла равна O((1 + n) / 2 * n). Конечно, по правилам ТА мы можем просто убрать константы (мое имхо, так делать нельзя) и тогда получим O(n^2).

Просто на сколько я понимаю итератор сам просто последовательно проходится по всем индексам и получается, что сам ты будешь подставлять индексы, что механизм итераторов сделает это за тебя. Нет ни какой разницы и следовательно ущерба скорости.
Я прав? Если нет поясните в чем не прав.

Отредактировано maxim83632 (Май 24, 2015 02:44:51)

Офлайн

#5 Май 24, 2015 02:43:08

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

Ну на самом деле в Вашем коде Вы не меняете список. Вы меняете его элемент А если по-вопросу, то зависит от структуры “изменений”. Иногда это бывает удобно запихнуть в map или сделать генератором списков. Все зависит от задачи.

P.S. Не очень хорошей практикой считается изменение количества элементов списка в процессе работы с ним в цикле for. Хотя есть и исключения…

Отредактировано 4kpt_III (Май 24, 2015 02:44:28)

Офлайн

#6 Май 24, 2015 02:43:31

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

maxim83632
Для иллюстрации всего вышесказанного посмотрите на этот пример (только пример!):

>>> l = range(5)
>>> l
[0, 1, 2, 3, 4]
>>> for i in l[::-1]:
...     del i
... 
>>> l
[0, 1, 2, 3, 4]
>>> 
>>> for i in range(len(l))[::-1]:
...     del l[i]
... 
>>> l
[]



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Май 24, 2015 02:47:21

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

Я дополнил предыдущий пост. Посмотрите пожалуйста. Меня интересует этот вопрос в ключе того, код работает быстро или медленно.

Офлайн

#8 Май 24, 2015 03:25:11

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

maxim83632
код работает быстро или медленно
>>> print timeit.timeit("""
... lst = [i for i in range (10)]
... def do_something(a):
...     a += 1
...     return a
... for i in range(len(lst)):
...     do_something(lst[i])
... """)
3.26911783218
>>> print timeit.timeit("""
... lst = [i for i in range (10)]
... def do_something(a):
...     a += 1
...     return a
... for i in lst:
...     do_something(i)
... """)
2.92600512505
>>> print timeit.timeit("""
... lst = [i for i in range (10)]
... def do_something(a):
...     a += 1
...     return a
... map(do_something, lst)
... """)
3.20691108704



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Май 24, 2015 03:25:51)

Офлайн

#9 Май 24, 2015 04:01:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

maxim83632
Он объясняет, что это быдло код так:
Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция
Доступ по индексу выполняется за O(1) - это просто берётся указатель на начало и к нему прибавляется смещение.



Офлайн

#10 Май 24, 2015 13:54:43

maxim83632
Зарегистрирован: 2015-03-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки. Быдлокод это или нет?

Всем спасибо за ответы и разъяснения

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version