for i in range(len(lst)): do_something(lst[i])
for i in range(len(lst)): do_something(lst[i])
maxim83632ДА!
На одном форуме один чувак утверждает, что это быдлокод:
for i in lst: do_something(i)
map(do_something, lst)
Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция и, следовательно, вся совокупность операций, то есть весь цикл for. Если бы мы оперировали массивом, то сложность этого цикла составляла бы O(n), но т.к. у нас список - сложность этого цикла равна O((1 + n) / 2 * n). Конечно, по правилам ТА мы можем просто убрать константы (мое имхо, так делать нельзя) и тогда получим O(n^2).
А если по-вопросу, то зависит от структуры “изменений”. Иногда это бывает удобно запихнуть в map или сделать генератором списков. Все зависит от задачи.>>> 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
код работает быстро или медленно
>>> 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
maxim83632Доступ по индексу выполняется за O(1) - это просто берётся указатель на начало и к нему прибавляется смещение.
Он объясняет, что это быдло код так:Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция