Найти - Пользователи
Полная версия: Списки. Быдлокод это или нет?
Начало » Python для новичков » Списки. Быдлокод это или нет?
1
maxim83632
На одном форуме один чувак утверждает, что это быдлокод:
for i in range(len(lst)):
    do_something(lst[i])
Правильно это или нет?
terabayt
maxim83632
На одном форуме один чувак утверждает, что это быдлокод:
ДА!
так как можно сделать так
for i in lst:
    do_something(i)
или
map(do_something, lst)
4kpt_III
maxim83632

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

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

P.S. Не очень хорошей практикой считается изменение количества элементов списка в процессе работы с ним в цикле for. Хотя есть и исключения…
JOHN_16
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
[]
maxim83632
Я дополнил предыдущий пост. Посмотрите пожалуйста. Меня интересует этот вопрос в ключе того, код работает быстро или медленно.
terabayt
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
py.user.next
maxim83632
Он объясняет, что это быдло код так:
Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция
Доступ по индексу выполняется за O(1) - это просто берётся указатель на начало и к нему прибавляется смещение.
maxim83632
Всем спасибо за ответы и разъяснения
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB